X-Git-Url: http://nitlanguage.org diff --git a/lib/binary/binary.nit b/lib/binary/binary.nit index 6268832..dbe07be 100644 --- a/lib/binary/binary.nit +++ b/lib/binary/binary.nit @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Add reading and writing binary services +# Read and write binary data with any `Reader` and `Writer` # # ~~~ # var w = new FileWriter.open("/tmp/data.bin") @@ -81,9 +81,9 @@ redef abstract class Writer do assert bits.length <= 8 - var int = 0 + var int = 0u8 for b in bits.length.times do - if bits[b] then int += 2**b + if bits[b] then int |= 1u8 << (7 - b) end write_byte int @@ -107,7 +107,7 @@ redef abstract class Writer # Compared to `write_string`, this method supports null bytes in `text`. fun write_block(text: Text) do - write_int64 text.length + write_int64 text.byte_length write text end @@ -153,7 +153,7 @@ redef abstract class Reader # Read a single byte and return `true` if its value is different than 0 # # Returns `false` when an error is pending (`last_error != null`). - fun read_bool: Bool do return read_byte != 0 + fun read_bool: Bool do return read_byte != 0u8 # Get an `Array` of 8 `Bool` by reading a single byte # @@ -164,7 +164,11 @@ redef abstract class Reader do var int = read_byte if int == null then return new Array[Bool] - return [for b in 8.times do int.bin_and(2**b) > 0] + var arr = new Array[Bool] + for i in [7 .. 0].step(-1) do + arr.push(((int >> i) & 1u8) != 0u8) + end + return arr end # Read a null terminated string @@ -174,11 +178,13 @@ redef abstract class Reader # Returns a truncated string when an error is pending (`last_error != null`). fun read_string: String do - var buf = new FlatBuffer + var buf = new Bytes.empty loop var byte = read_byte - if byte == null or byte == 0x00 then return buf.to_s - buf.bytes.add byte + if byte == null or byte == 0u8 then + return buf.to_s + end + buf.add byte end end @@ -191,7 +197,7 @@ redef abstract class Reader do var length = read_int64 if length == 0 then return "" - return read(length) + return read_bytes(length).to_s end # Read a floating point on 32 bits and return it as a `Float` @@ -216,7 +222,7 @@ redef abstract class Reader end # Utility for `read_float` - private fun native_read_float(b0, b1, b2, b3: Int, big_endian: Bool): Float `{ + private fun native_read_float(b0, b1, b2, b3: Byte, big_endian: Bool): Float `{ union { unsigned char b[4]; float val; @@ -259,7 +265,7 @@ redef abstract class Reader end # Utility for `read_double` - private fun native_read_double(b0, b1, b2, b3, b4, b5, b6, b7: Int, big_endian: Bool): Float `{ + private fun native_read_double(b0, b1, b2, b3, b4, b5, b6, b7: Byte, big_endian: Bool): Float `{ union { unsigned char b[8]; double val; @@ -309,7 +315,7 @@ redef abstract class Reader end # Utility for `read_int64` - private fun native_read_int64(b0, b1, b2, b3, b4, b5, b6, b7: Int, big_endian: Bool): Int `{ + private fun native_read_int64(b0, b1, b2, b3, b4, b5, b6, b7: Byte, big_endian: Bool): Int `{ union { unsigned char b[8]; int64_t val; @@ -335,7 +341,7 @@ end redef class Int # Utility for `BinaryWriter` - private fun int64_byte_at(index: Int, big_endian: Bool): Int `{ + private fun int64_byte_at(index: Int, big_endian: Bool): Byte `{ union { unsigned char bytes[8]; int64_t val; @@ -354,7 +360,7 @@ end redef class Float # Utility for `BinaryWriter` - private fun float_byte_at(index: Int, big_endian: Bool): Int `{ + private fun float_byte_at(index: Int, big_endian: Bool): Byte `{ union { unsigned char bytes[4]; float val; @@ -371,7 +377,7 @@ redef class Float `} # Utility for `BinaryWriter` - private fun double_byte_at(index: Int, big_endian: Bool): Int `{ + private fun double_byte_at(index: Int, big_endian: Bool): Byte `{ union { unsigned char bytes[8]; double val;