Skip to content

Commit 08f5e2b

Browse files
authored
Merge pull request #22 from attdona/master
Fix encode/decode of unsigned and negative numbers, see also #20
2 parents 773ba84 + 16d273e commit 08f5e2b

File tree

3 files changed

+42
-5
lines changed

3 files changed

+42
-5
lines changed

Diff for: src/constants.jl

+5
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ const UINT16_MAX_PLUS_ONE = 0x10000
3838
const UINT32_MAX_PLUS_ONE = 0x100000000
3939
const UINT64_MAX_PLUS_ONE = 0x10000000000000000
4040

41+
const INT8_MAX_POSITIVE = 0x7f
42+
const INT16_MAX_POSITIVE = 0x7fff
43+
const INT32_MAX_POSITIVE = 0x7fffffff
44+
const INT64_MAX_POSITIVE = 0x7fffffffffffffff
45+
4146
const SIZE_OF_FLOAT64 = sizeof(Float64)
4247
const SIZE_OF_FLOAT32 = sizeof(Float32)
4348
const SIZE_OF_FLOAT16 = sizeof(Float16)

Diff for: src/decode.jl

+32-4
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,39 @@ end
7474
decode_internal(io::IO, ::Val{TYPE_0}) = decode_unsigned(io)
7575

7676
function decode_internal(io::IO, ::Val{TYPE_1})
77-
data = signed(decode_unsigned(io))
78-
if (i = Int128(data) + one(data)) > typemax(Int64)
79-
return -i
77+
addntl_info = read(io, UInt8) & ADDNTL_INFO_MASK
78+
if addntl_info < SINGLE_BYTE_UINT_PLUS_ONE
79+
return -signed(addntl_info + Int8(1))
80+
elseif addntl_info == ADDNTL_INFO_UINT8
81+
data = bswap(read(io, UInt8))
82+
if data > INT8_MAX_POSITIVE
83+
return -Int16(data + one(data))
84+
else
85+
return -signed(data + one(data))
86+
end
87+
elseif addntl_info == ADDNTL_INFO_UINT16
88+
data = bswap(read(io, UInt16))
89+
if data > INT16_MAX_POSITIVE
90+
return -Int32(data + one(data))
91+
else
92+
return -signed(data + one(data))
93+
end
94+
elseif addntl_info == ADDNTL_INFO_UINT32
95+
data = bswap(read(io, UInt32))
96+
if data > INT32_MAX_POSITIVE
97+
return -Int64(data + one(data))
98+
else
99+
return -signed(data + one(data))
100+
end
101+
elseif addntl_info == ADDNTL_INFO_UINT64
102+
data = bswap(read(io, UInt64))
103+
if data > INT64_MAX_POSITIVE
104+
return -Int128(data + one(data))
105+
else
106+
return -signed(data + one(data))
107+
end
80108
else
81-
return -(data + one(data))
109+
error("Unknown Int type")
82110
end
83111
end
84112

Diff for: src/encode.jl

+5-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,11 @@ function encode(io::IO, num::Unsigned)
7979
end
8080

8181
function encode(io::IO, num::T) where T <: Signed
82-
encode_unsigned_with_type(io, TYPE_1, unsigned(-num - one(T)))
82+
if num >= 0
83+
encode_smallest_int(io, TYPE_0, unsigned(num))
84+
else
85+
encode_smallest_int(io, TYPE_1, unsigned(-num - one(T)))
86+
end
8387
end
8488

8589
function encode(io::IO, byte_string::Vector{UInt8})

0 commit comments

Comments
 (0)