我正在为radius编写一个rlm_python模块,该模块从“Accouting-Request”数据包中获取位置
但是,该位置采用二进制格式,
"\001\027\002\025\001+\001\024"
当我尝试使用struct
解压缩时[root@server ~]# python
Python 2.4.3 (#1, May 5 2011, 16:39:10)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from struct import *
>>> unpack('hhl',"\001\027\002\025\001+\001\024" )
Traceback (most recent call last):
File "<stdin>", line 1, in ?
struct.error: unpack str size does not match format
任何想法,我如何解包这些数据?
答案 0 :(得分:1)
您的字符串长度为八个字节,但unpack
可能不期望(除非您使用修饰符,否则大小与平台无关)。
Python 2.4.3 (#1, May 5 2011, 16:39:10)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from struct import *
>>> unpack('hhl',"\001\027\002\025\001+\001\024" )
Traceback (most recent call last):
File "<stdin>", line 1, in ?
struct.error: unpack str size does not match format
>>> unpack('=hhl',"\001\027\002\025\001+\001\024" )
(5889, 5378, 335620865)
如果第一个字符不是其中之一,那么&#39; @&#39;假设。 使用C编译器的sizeof表达式确定本机大小和对齐方式。这始终与本机字节顺序相结合。 标准尺寸仅取决于格式字符;请参阅格式字符部分中的表格。
答案 1 :(得分:0)
>>> import struct
>>> data = "\001\027\002\025\001+\001\024"
>>> data
'\x01\x17\x02\x15\x01+\x01\x14'
>>> len(data)
8
>>> struct.calcsize('hhl')
16
>>> struct.calcsize('!hhl')
8
>>> struct.unpack('!hhl',data)
(279, 533, 19595540)
根据您的体系结构,除非您修改构造函数,否则某些元素的大小可能会更改。