@@ -80,17 +80,25 @@ def __init__(self, raw, offset):
80
80
self .full_len = (self .payload_len + 3 ) & ~ 3
81
81
self .raw = raw [offset + 4 :offset + self .payload_len ]
82
82
83
+ def format_byte_order (byte_order ):
84
+ if byte_order :
85
+ return ">" if byte_order == "big-endian" else "<"
86
+ return ""
87
+
83
88
def as_u8 (self ):
84
89
return struct .unpack ("B" , self .raw )[0 ]
85
90
86
- def as_u16 (self ):
87
- return struct .unpack ("H" , self .raw )[0 ]
91
+ def as_u16 (self , byte_order = None ):
92
+ endian = NlAttr .format_byte_order (byte_order )
93
+ return struct .unpack (f"{ endian } H" , self .raw )[0 ]
88
94
89
- def as_u32 (self ):
90
- return struct .unpack ("I" , self .raw )[0 ]
95
+ def as_u32 (self , byte_order = None ):
96
+ endian = NlAttr .format_byte_order (byte_order )
97
+ return struct .unpack (f"{ endian } I" , self .raw )[0 ]
91
98
92
- def as_u64 (self ):
93
- return struct .unpack ("Q" , self .raw )[0 ]
99
+ def as_u64 (self , byte_order = None ):
100
+ endian = NlAttr .format_byte_order (byte_order )
101
+ return struct .unpack (f"{ endian } Q" , self .raw )[0 ]
94
102
95
103
def as_strz (self ):
96
104
return self .raw .decode ('ascii' )[:- 1 ]
@@ -365,11 +373,14 @@ def _add_attr(self, space, name, value):
365
373
elif attr ["type" ] == 'u8' :
366
374
attr_payload = struct .pack ("B" , int (value ))
367
375
elif attr ["type" ] == 'u16' :
368
- attr_payload = struct .pack ("H" , int (value ))
376
+ endian = NlAttr .format_byte_order (attr .byte_order )
377
+ attr_payload = struct .pack (f"{ endian } H" , int (value ))
369
378
elif attr ["type" ] == 'u32' :
370
- attr_payload = struct .pack ("I" , int (value ))
379
+ endian = NlAttr .format_byte_order (attr .byte_order )
380
+ attr_payload = struct .pack (f"{ endian } I" , int (value ))
371
381
elif attr ["type" ] == 'u64' :
372
- attr_payload = struct .pack ("Q" , int (value ))
382
+ endian = NlAttr .format_byte_order (attr .byte_order )
383
+ attr_payload = struct .pack (f"{ endian } Q" , int (value ))
373
384
elif attr ["type" ] == 'string' :
374
385
attr_payload = str (value ).encode ('ascii' ) + b'\x00 '
375
386
elif attr ["type" ] == 'binary' :
@@ -415,11 +426,11 @@ def _decode(self, attrs, space):
415
426
elif attr_spec ['type' ] == 'u8' :
416
427
decoded = attr .as_u8 ()
417
428
elif attr_spec ['type' ] == 'u16' :
418
- decoded = attr .as_u16 ()
429
+ decoded = attr .as_u16 (attr_spec . byte_order )
419
430
elif attr_spec ['type' ] == 'u32' :
420
- decoded = attr .as_u32 ()
431
+ decoded = attr .as_u32 (attr_spec . byte_order )
421
432
elif attr_spec ['type' ] == 'u64' :
422
- decoded = attr .as_u64 ()
433
+ decoded = attr .as_u64 (attr_spec . byte_order )
423
434
elif attr_spec ["type" ] == 'string' :
424
435
decoded = attr .as_strz ()
425
436
elif attr_spec ["type" ] == 'binary' :
0 commit comments