From bc25faed6996ef11067d92036e4e228a7c45a2ad Mon Sep 17 00:00:00 2001 From: Henry Schimke Date: Wed, 31 Aug 2022 17:16:05 -0500 Subject: [PATCH] port BitSourceBuilder --- src/common/BitSourceBuilder.java | 65 ------------------------------ src/common/mod.rs | 68 ++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 65 deletions(-) delete mode 100644 src/common/BitSourceBuilder.java diff --git a/src/common/BitSourceBuilder.java b/src/common/BitSourceBuilder.java deleted file mode 100644 index 9f02f7f..0000000 --- a/src/common/BitSourceBuilder.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common; - -import java.io.ByteArrayOutputStream; - -/** - * Class that lets one easily build an array of bytes by appending bits at a time. - * - * @author Sean Owen - */ -public final class BitSourceBuilder { - - private final ByteArrayOutputStream output; - private int nextByte; - private int bitsLeftInNextByte; - - public BitSourceBuilder() { - output = new ByteArrayOutputStream(); - nextByte = 0; - bitsLeftInNextByte = 8; - } - - public void write(int value, int numBits) { - if (numBits <= bitsLeftInNextByte) { - nextByte <<= numBits; - nextByte |= value; - bitsLeftInNextByte -= numBits; - if (bitsLeftInNextByte == 0) { - output.write(nextByte); - nextByte = 0; - bitsLeftInNextByte = 8; - } - } else { - int bitsToWriteNow = bitsLeftInNextByte; - int numRestOfBits = numBits - bitsToWriteNow; - int mask = 0xFF >> (8 - bitsToWriteNow); - int valueToWriteNow = (value >>> numRestOfBits) & mask; - write(valueToWriteNow, bitsToWriteNow); - write(value, numRestOfBits); - } - } - - public byte[] toByteArray() { - if (bitsLeftInNextByte < 8) { - write(0, bitsLeftInNextByte); - } - return output.toByteArray(); - } - -} \ No newline at end of file diff --git a/src/common/mod.rs b/src/common/mod.rs index 44ba495..fa4dbeb 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -1999,3 +1999,71 @@ impl DecoderRXingResult { self.symbologyModifier } } + +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// package com.google.zxing.common; + +// import java.io.ByteArrayOutputStream; + +/** + * Class that lets one easily build an array of bytes by appending bits at a time. + * + * @author Sean Owen + */ +pub struct BitSourceBuilder { + output: Vec, + nextByte: u32, + bitsLeftInNextByte: u32, +} + +impl BitSourceBuilder { + pub fn new() -> Self { + Self { + output: Vec::new(), + nextByte: 0, + bitsLeftInNextByte: 8, + } + } + + pub fn write(&mut self, value: u32, numBits: u32) { + if numBits <= self.bitsLeftInNextByte { + self.nextByte <<= numBits; + self.nextByte |= value; + self.bitsLeftInNextByte -= numBits; + if self.bitsLeftInNextByte == 0 { + self.output.push(self.nextByte as u8); + self.nextByte = 0; + self.bitsLeftInNextByte = 8; + } + } else { + let bitsToWriteNow = self.bitsLeftInNextByte; + let numRestOfBits = numBits - bitsToWriteNow; + let mask = 0xFF >> (8 - bitsToWriteNow); + let valueToWriteNow = (value >> numRestOfBits) & mask; + self.write(valueToWriteNow, bitsToWriteNow); + self.write(value, numRestOfBits); + } + } + + pub fn toByteArray(&mut self) -> &Vec { + if self.bitsLeftInNextByte < 8 { + self.write(0, self.bitsLeftInNextByte); + } + &self.output + } +}