python与C/C++中基本类型的相互转换 struct.pack
2009-07-29 17:04
603 查看
使用struct.pack一定要注意是在64位系统还是32位系统。
如struct.pack('L', 1) 返回长度在64位系统 返回长度是8,32位系统 回返是4
以下自己写个转换算法
DWORD_LEN = 4 #为32位系统
CONST_SQRT = [256 ** i for i in range(DWORD_LEN)]
def _PyInt_to_CBinStr(nVal):
'''把py的int转 成C中的int,返回py的str,即C中int的二进制形式;
注:转换时,以低字节在前面,即intel CPU字节排序方式。'''
retBinStr = ''
for i in range(DWORD_LEN -1, -1, -1):
retBinStr = '%c%s' % (chr(nVal / CONST_SQRT[i]), retBinStr)
nVal %= CONST_SQRT[i]
return retBinStr
def _CBinStr_Int_to_PyInt(str_CBin):
'''把C形式的二进制int转 成py的int。
注:转换时,以低字节在前面,即intel CPU字节排序方式。'''
nPyInt = 0
for i in range(DWORD_LEN):
nPyInt += ord(str_CBin[i]) * CONST_SQRT[i]
return nPyInt
今天遇到个用python 以二进制方式写文件的问题,想把 py中的 数值写进文件,如下:
上面这个转,浪费偶超多时间查资料。。。。
t;p>最终py的内置库可以作转换 struct
关于 struct.pack 的第一个参数 fmt ---转换方式,内置文档中有说明,也害找了很久。。。
对应表如下:
fmt参数:
再转一篇文章,来自 http://wwty.javaeye.com/blog/401414
这两天做TCP协议,数据的传输都是二进制的,需要解释,于是用到了struct
看到这样一句代码:
当时没有明白format=">I"是什么意思,从google找了一下,有人说这个东西,可都是比较笼统,没能让我明白,于是硬着头皮看API:
By default, C numbers are represented in the machine’s native format and byte order, and properly aligned by skipping pad bytes if necessary (according to the rules used by the C compiler).
通常,C语言下数字都是机器语言的格式并且按照字节排序,同时在需要的情况下会利用跳过填补的字节来进行适当的调整
Alternatively, the first character of the format string can be used to indicate the byte order, size and alignment of the packed data。
非此即彼:字符串的第一个字符要么被用于表示字符串的字节的排序,或者是字符串的size,还有就是数据是否对准。
Native byte order is big-endian or little-endian, depending on the host system. For example, Motorola and Sun processors are big-endian; Intel and DEC processors are little-endian.
计算机的字节序要么是高位顺序,要么是低位的,这依赖于主机本身。比如,摩托罗拉和sun的处理器是高位的,但是intel和DEC的是低位的。
这样子就明白了上面的format=">I"的意思,也就是说按照高位顺序来格式化取得一个int或long值。下面问题就又来了,你怎么知道读取的就是一个int或long值呢?
通过看struct的文档,可以看到struct通过两张表制定了一定的format规则,我按照自己的观察,给他归纳为两类,一个是和C当中类型的对照,另一个就是选择按照高位还是低位来解释字节。上面已经说了高低字节顺序,那么观察和C对照的表格,发现I 代表的就是integer or long ,详细的可以去看python的API。
下面是一些使用的例子,具体的使用,可以参考这些例子:
随后是关于网络字节的东东,从网上看来的,感觉有用:
Python的socket库采用string类型来发送和接收数据,这样当我们用
i = socket.recv(4)
来接收一个4字节的整数时,该整数实际上是以二进制的形式保存在字符串 i 的前4个字节中;大多数的时候我们需要的是一个真正的integer/long型,而不是一个用string型表示的整型。这时我们可以使用struct库:Interpret
strings as packed binary data. 对上面的情况,我们可以写
t = unpack("I", i)
第一个参数是格式化字符串,I指明字符串 i 包含的头一个数据项是一个以C语言的unsigned integer表示的整数,这里 i 只包含了一个数据项,实际上这个被解释的字符串也可以包含多个数据项,只要在格式化字符串里为每项数据指明一个格式即可;自然地,unpack返回的就是一个tuple类型了。
如struct.pack('L', 1) 返回长度在64位系统 返回长度是8,32位系统 回返是4
以下自己写个转换算法
DWORD_LEN = 4 #为32位系统
CONST_SQRT = [256 ** i for i in range(DWORD_LEN)]
def _PyInt_to_CBinStr(nVal):
'''把py的int转 成C中的int,返回py的str,即C中int的二进制形式;
注:转换时,以低字节在前面,即intel CPU字节排序方式。'''
retBinStr = ''
for i in range(DWORD_LEN -1, -1, -1):
retBinStr = '%c%s' % (chr(nVal / CONST_SQRT[i]), retBinStr)
nVal %= CONST_SQRT[i]
return retBinStr
def _CBinStr_Int_to_PyInt(str_CBin):
'''把C形式的二进制int转 成py的int。
注:转换时,以低字节在前面,即intel CPU字节排序方式。'''
nPyInt = 0
for i in range(DWORD_LEN):
nPyInt += ord(str_CBin[i]) * CONST_SQRT[i]
return nPyInt
今天遇到个用python 以二进制方式写文件的问题,想把 py中的 数值写进文件,如下:
f = open(r'c:/t.bin', 'wb') f.writer(1) # 这里是不能直接转数值参数的,要作个转换成二进制buff
上面这个转,浪费偶超多时间查资料。。。。
t;p>最终py的内置库可以作转换 struct
import struct strBuff = struct.pack('L'. 1) f.write(strBuff)
关于 struct.pack 的第一个参数 fmt ---转换方式,内置文档中有说明,也害找了很久。。。
对应表如下:
fmt参数:
|
再转一篇文章,来自 http://wwty.javaeye.com/blog/401414
这两天做TCP协议,数据的传输都是二进制的,需要解释,于是用到了struct
看到这样一句代码:
length = struct.unpack('>I', self.buffer[:4])[0]
当时没有明白format=">I"是什么意思,从google找了一下,有人说这个东西,可都是比较笼统,没能让我明白,于是硬着头皮看API:
By default, C numbers are represented in the machine’s native format and byte order, and properly aligned by skipping pad bytes if necessary (according to the rules used by the C compiler).
通常,C语言下数字都是机器语言的格式并且按照字节排序,同时在需要的情况下会利用跳过填补的字节来进行适当的调整
Alternatively, the first character of the format string can be used to indicate the byte order, size and alignment of the packed data。
非此即彼:字符串的第一个字符要么被用于表示字符串的字节的排序,或者是字符串的size,还有就是数据是否对准。
Native byte order is big-endian or little-endian, depending on the host system. For example, Motorola and Sun processors are big-endian; Intel and DEC processors are little-endian.
计算机的字节序要么是高位顺序,要么是低位的,这依赖于主机本身。比如,摩托罗拉和sun的处理器是高位的,但是intel和DEC的是低位的。
这样子就明白了上面的format=">I"的意思,也就是说按照高位顺序来格式化取得一个int或long值。下面问题就又来了,你怎么知道读取的就是一个int或long值呢?
通过看struct的文档,可以看到struct通过两张表制定了一定的format规则,我按照自己的观察,给他归纳为两类,一个是和C当中类型的对照,另一个就是选择按照高位还是低位来解释字节。上面已经说了高低字节顺序,那么观察和C对照的表格,发现I 代表的就是integer or long ,详细的可以去看python的API。
下面是一些使用的例子,具体的使用,可以参考这些例子:
# 取前5个字符,跳过4个字符华,再取3个字符 format = '5s 4x 3s' 2. 使用struck.unpack获取子字符串 import struct print struct.unpack(format, 'Test astring') #('Test', 'ing') 来个简单的例子吧,有一个字符串'He is not very happy',处理一下,把中间的not去掉,然后再输出。 import struct theString = 'He is not very happy' format = '2s 1x 2s 5x 4s 1x 5s' print ' '.join(struct.unpack(format, theString)) 输出结果: He is very happy
随后是关于网络字节的东东,从网上看来的,感觉有用:
Python的socket库采用string类型来发送和接收数据,这样当我们用
i = socket.recv(4)
来接收一个4字节的整数时,该整数实际上是以二进制的形式保存在字符串 i 的前4个字节中;大多数的时候我们需要的是一个真正的integer/long型,而不是一个用string型表示的整型。这时我们可以使用struct库:Interpret
strings as packed binary data. 对上面的情况,我们可以写
t = unpack("I", i)
第一个参数是格式化字符串,I指明字符串 i 包含的头一个数据项是一个以C语言的unsigned integer表示的整数,这里 i 只包含了一个数据项,实际上这个被解释的字符串也可以包含多个数据项,只要在格式化字符串里为每项数据指明一个格式即可;自然地,unpack返回的就是一个tuple类型了。
相关文章推荐
- python入门教程、基本类型的操作及相互转换
- C/C++ 基本数据类型之间的相互转换 int / char / string / vector windows与linux通用
- python基本类型、操作及相互转换
- Java 记录java基本类型与Byte数组之间相互转换
- 高效掌握C#第一回---C#中的基本数据类型及其相互转换
- 0710C++基本数据类型之间的转换
- C++的一些基本数据类型转换
- C++中单个数字的int类型和char类型之间的相互转换
- Objective-C中基本数据烦类型与对象数据类型相互转换的方法(OC中NSString的常用API的基础应用3)
- python 时间类型和相互转换
- C++里的int 和string类型相互转换
- python 时间类型和相互转换
- C++数值类型与string的相互转换
- java基本数据类型、对应的封装类以及字符串之间的相互转换
- C++中string,char,int,double等数据类型的相互转换及与ASCII码的转换
- C++各数据类型的相互转换 总结一
- Python中实现字符串类型与字典类型相互转换的方法
- C++程序员学Java系列之五:常量,变量,基本数据类型及转换
- 包装类、基本数据类型及String类之间的相互转换
- C++数值类型与string的相互转换