python unpack二进制数据

时间:2013-04-05 14:21:07

标签: python linux debian

我正在为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

任何想法,我如何解包这些数据?

2 个答案:

答案 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)

来自struct.unpack docs

  

如果第一个字符不是其中之一,那么&#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)

根据您的体系结构,除非您修改构造函数,否则某些元素的大小可能会更改。