通过一些Python代码,我注意到十六进制值有许多不同的表示形式。例如,如果我像这样选择一个数字:
xx = '\x03\xff'
然后是下面的命令(我正在使用的一个版本将小端转换为大端)
yy = hex(struct.unpack('>H', xx)[0])
将返回:
'0x3ff'
但是,此命令
zz = xx.encode('hex')
将返回:
'03ff'
最后,仅打印输出的值将返回以下内容
'\x03\xff'
从它的外观来看,有三种不同类型的十六进制。
'\xFF'
'0xFF'
'FF'
有什么不同?
如果有人可以建议一种更好的方法将小端数字转换为大端数字,会给出的加分。上面的yy
方法对大于两个字节的数字不起作用,我正在处理一些16字节长的十六进制字符串(包括与ascii/整数值不对应的值)
发布于 2012-10-29 15:09:44
任何使用\x
的代码都是字符串转义代码,它恰好使用十六进制表示法;其他转义代码包括表示换行符的\n
、表示文字引号的\'
等。python字符串是一个字节序列,您可以使用这些字符指定ASCII可打印范围之外的文字值。当Python在解释器中回显字符串值时,或者您在字符串上打印repr()
调用的结果时,Python将使用这样的转义来表示任何不能打印为ASCII码字符的字节:
>>> chr(65)
'A'
>>> chr(11)
'\x0b'
与.encode('hex')
一样,hex()
函数返回一个非常具体的字符串表示,不同之处在于前者包含0x
前缀。还有另外两种方法可以生成这样的字符串表示:使用'%x'
和'%X'
字符串格式化程序,它们使用小写或大写字母作为表示。
>>> hex(11)
'0xb'
>>> '\x0b'.encode('hex')
'0b'
>>> '%x' % (11,)
'b'
>>> '%X' % (11,)
'B'
这些都是字符串表示(一系列ASCII字符),与原始数据的关系与str(number)
与整数数据的关系相同;您已经更改了类型,并且离更改字节顺序的目标更远了。
要将一段二进制信息从小端更改为大端,您需要知道该信息的大小。如果你所拥有的都是短整数,那么你需要每两个字节翻转一次,但是如果你有正常的(长)整数,那么你每个值有4个字节,你需要颠倒每4个字节。
我认为使用struct
模块是一种很好的方法,因为您必须指定值类型。下面的代码将xx
解释为一个大端无符号短整数,然后将其打包成一个二进制表示形式,作为一个小端无符号短整数:
>>> import struct
>>> xx = '\x03\xff'
>>> struct.pack('<H', *struct.unpack('>H', xx))
'\xff\x03'
发布于 2012-10-29 15:00:42
'\xFF‘表示包含ASCII码为255的字符的字符串。
例如:print '\x41'
给出'A‘(因为这是带有ASCII码41的字符)
xx.encode('hex')
和hex(struct.unpack('>H', xx)[0])
只是给出了字符串xx包含的ASCII码的人类可读的十六进制表示。这意味着结果字符串包含a和f之间或0和9之间的多个字符。
https://stackoverflow.com/questions/13123877
复制相似问题