Skip to content

Commit c1e8ca6

Browse files
committed
fix: datetime decode
1 parent 079808d commit c1e8ca6

2 files changed

Lines changed: 22 additions & 13 deletions

File tree

decode.v

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ pub fn (mut d Decoder) decode_from_string[T](data string) ! {
3535
pub fn (mut d Decoder) decode[T](data []u8, mut val T) ! {
3636
d.buffer = data
3737
d.next()!
38-
println(d.buffer)
39-
println(d.bd)
4038

4139
$if T is $int {
4240
d.decode_integer[T](mut val) or { return error('error decoding integer: ${err}') }
@@ -221,10 +219,12 @@ pub fn (mut d Decoder) decode_time[T](mut val T) ! {
221219
| 0xd6 | -1 | seconds in 32-bit unsigned int |
222220
+--------+--------+--------+--------+--------+--------+
223221
*/
224-
sec := int(binary.big_endian_u32(data[d.pos..d.pos + 4]))
225-
println(binary.big_endian_u32(data[d.pos..d.pos + 4]))
226-
val = time.unix(i64(sec))
227-
d.pos += 4
222+
if data[d.pos] != u8(0xFF) {
223+
return error('invalid extension format')
224+
}
225+
data32 := binary.big_endian_u32(data[d.pos + 1..d.pos + 4])
226+
val = time.unix(i64(data32))
227+
d.pos += 5
228228
}
229229
mp_fix_ext_8 {
230230
/*
@@ -234,8 +234,13 @@ pub fn (mut d Decoder) decode_time[T](mut val T) ! {
234234
| 0xd7 | -1 | nanosec. in 30-bit unsigned int | seconds in 34-bit unsigned int |
235235
+--------+--------+--------+--------+--------+------^-+--------+--------+--------+--------+
236236
*/
237-
sec := int(binary.big_endian_u64(data[d.pos..d.pos + 8]))
238-
val = time.unix(i64(sec))
237+
if data[d.pos] != u8(0xFF) {
238+
return error('invalid extension format')
239+
}
240+
data64 := binary.big_endian_u64(data[d.pos + 1..d.pos + 8])
241+
sec := int(data64 & 0x00000003ffffffff)
242+
nsec := int(data64 >> 34)
243+
val = time.unix_nanosecond(i64(sec), nsec)
239244
d.pos += 8
240245
}
241246
mp_ext_8 {
@@ -249,8 +254,13 @@ pub fn (mut d Decoder) decode_time[T](mut val T) ! {
249254
seconds in 64-bit signed int |
250255
+--------+--------+--------+--------+--------+--------+--------+--------+
251256
*/
252-
sec := int(binary.big_endian_u64(data[d.pos..d.pos + 12]))
253-
val = time.unix(i64(sec))
257+
258+
if data[d.pos] != u8(0x0C) || data[d.pos + 4] != u8(0xFF) {
259+
return error('invalide extension format')
260+
}
261+
data32 := binary.big_endian_u32(data[d.pos + 1 + 4..d.pos + 12])
262+
data64 := binary.big_endian_u64(data[d.pos + 1 + 8..d.pos + 12])
263+
val = time.unix_nanosecond(i64(data64), data32)
254264
d.pos += 12
255265
}
256266
else {

decode_test.v

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,8 @@ fn test_decoding() {
5151
assert msgpack.decode[f64](hex.decode('cb40091eb851eb851f')!)! == 3.14
5252
assert msgpack.decode[f32](hex.decode('ca4048f5c3')!)! == 3.14
5353

54-
// // Test decoding time
55-
// // Assuming time is 2023-11-27 12:34:56
56-
// assert msgpack.decode[time.Time](hex.decode('d6ff642196d0')!)! == time.unix(1679922896)
54+
// Test decoding time
55+
assert msgpack.decode[time.Time](hex.decode('d6ff642196d0')!)! == time.unix(1679922896)
5756

5857
// // Test decoding byte slices
5958
// assert msgpack.decode[[]u8](hex.decode('c403010203')!)! == [u8(1), 2, 3]

0 commit comments

Comments
 (0)