@@ -1148,7 +1148,7 @@ pub inline fn takeStruct(r: *Reader, comptime T: type, endian: std.builtin.Endia
1148
1148
return res ;
1149
1149
},
1150
1150
.@"packed" = > {
1151
- return takeInt (r , info .backing_integer .? , endian );
1151
+ return @bitCast ( try takeInt (r , info .backing_integer .? , endian ) );
1152
1152
},
1153
1153
},
1154
1154
else = > @compileError ("not a struct" ),
@@ -1173,7 +1173,7 @@ pub inline fn peekStruct(r: *Reader, comptime T: type, endian: std.builtin.Endia
1173
1173
return res ;
1174
1174
},
1175
1175
.@"packed" = > {
1176
- return peekInt (r , info .backing_integer .? , endian );
1176
+ return @bitCast ( try peekInt (r , info .backing_integer .? , endian ) );
1177
1177
},
1178
1178
},
1179
1179
else = > @compileError ("not a struct" ),
@@ -1724,6 +1724,27 @@ test "takeDelimiterInclusive when it rebases" {
1724
1724
}
1725
1725
}
1726
1726
1727
+ test "takeStruct and peekStruct packed" {
1728
+ var r : Reader = .fixed (&.{ 0b11110000 , 0b00110011 });
1729
+ const S = packed struct (u16 ) { a : u2 , b : u6 , c : u7 , d : u1 };
1730
+
1731
+ try testing .expectEqual (@as (S , .{
1732
+ .a = 0b11 ,
1733
+ .b = 0b001100 ,
1734
+ .c = 0b1110000 ,
1735
+ .d = 0b1 ,
1736
+ }), try r .peekStruct (S , .big ));
1737
+
1738
+ try testing .expectEqual (@as (S , .{
1739
+ .a = 0b11 ,
1740
+ .b = 0b001100 ,
1741
+ .c = 0b1110000 ,
1742
+ .d = 0b1 ,
1743
+ }), try r .takeStruct (S , .big ));
1744
+
1745
+ try testing .expectError (error .EndOfStream , r .takeStruct (S , .little ));
1746
+ }
1747
+
1727
1748
/// Provides a `Reader` implementation by passing data from an underlying
1728
1749
/// reader through `Hasher.update`.
1729
1750
///
0 commit comments