通过一些Python代码,我注意到十六进制值有许多不同的表示.例如,如果我选择这样的数字:
xx = '\x03\xff'
Run Code Online (Sandbox Code Playgroud)
然后是以下命令(我用它来将little endian转换为big endian的版本)
yy = hex(struct.unpack('>H', xx)[0])
Run Code Online (Sandbox Code Playgroud)
将返回:
'0x3ff'
Run Code Online (Sandbox Code Playgroud)
但是,这个命令
zz = xx.encode('hex')
Run Code Online (Sandbox Code Playgroud)
将返回:
'03ff'
Run Code Online (Sandbox Code Playgroud)
最后,只打印出值将返回此值
'\x03\xff'
Run Code Online (Sandbox Code Playgroud)
从它的外观来看,有三种不同类型的十六进制.
'\xFF''0xFF''FF'有什么不同?
如果有人可以建议更好的方法将小端转换为大端数,则可以获得奖励积分.上面的方法yy不适用于大于两个字节的数字,而且我正在使用一些16字节长的十六进制字符串(包括与ascii/integer值不对应的值)
任何使用\x都是一个字符串转义码,恰好使用十六进制表示法; 其他转义码包括\n换行符,\'文字引号等.python字符串是一个字节序列,您可以使用这些字符指定ASCII可打印范围之外的文字值.当Python在解释器中回显一个字符串值,或者repr()在字符串上打印调用结果时,Python将使用这样的转义来表示任何无法打印为ASCII字符的字节:
>>> chr(65)
'A'
>>> chr(11)
'\x0b'
Run Code Online (Sandbox Code Playgroud)
该hex()函数返回一个非常具体的字符串表示,.encode('hex')区别在于前者包含0x前缀.还有两种方法可以产生这样的字符串表示; 使用'%x'和'%X'字符串格式化程序,使用小写或大写字母表示.
>>> hex(11)
'0xb'
>>> '\x0b'.encode('hex')
'0b'
>>> '%x' % (11,)
'b'
>>> '%X' % (11,)
'B'
Run Code Online (Sandbox Code Playgroud)
这些都是字符串表示(一系列ASCII字符),并且与原始数据和str(number)整数数据具有相同的关系; 您已更改类型,并且远离更改字节顺序的目标.
将一段二进制信息从小端更改为大端需要您知道该信息的大小.如果你只有短整数,那么你需要翻转每两个字节,但如果你有正常(长)整数,那么每个值有4个字节,你需要反转每4个字节.
struct我认为使用该模块是一种很好的方法,因为您必须指定值类型.以下将解释xx为big-endian unsigned short int,然后将其作为little-endian unsigned short int打包回二进制表示:
>>> import struct
>>> xx = '\x03\xff'
>>> struct.pack('<H', *struct.unpack('>H', xx))
'\xff\x03'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14299 次 |
| 最近记录: |