通过一些Python代码,我注意到有许多不同的十六进制值表示。例如,如果我选择这样一个数字:
xx = '\x03\xff'
然后是下面的命令(我正在使用它将little endian转换为big endian)
yy = hex(struct.unpack('>H', xx)[0])
将返回:
'0x3ff'
但是,这个命令
zz = xx.encode('hex')
将返回:
'03ff'
最后,只打印出值将返回
'\x03\xff'
从外观上看,有三种不同的十六进制。
'\xFF'
'0xFF'
'FF'
有什么区别?
如果有人能提出一种更好的方法,将一个小的尾数转换成一个大的尾数,就可以获得额外的积分。上面的yy
方法对大于两个字节的数字不起作用,我正在处理一些16字节长的十六进制字符串(包括与ascii/整数值不对应的值)
使用
\x
的任何内容都是字符串转义代码,它碰巧使用十六进制表示法;其他转义代码包括\n
用于换行符,\'
用于文字引号等。python字符串是字节序列,您可以使用这些字符指定ASCII可打印范围之外的文字值。当Python在解释器中向您回显字符串值,或者您在字符串上打印repr()
调用的结果时,Python将使用这样的转义来表示不能作为ASCII字符打印的任何字节:hex()
函数返回一个非常特定的字符串表示,就像.encode('hex')
一样,区别在于前者包含0x
前缀。还有两种方法可以生成这样的字符串表示;使用'%x'
和'%X'
字符串格式化程序,它们使用小写或大写字母表示。不过,这些都是字符串表示(一系列ASCII字符),与原始数据的关系与
str(number)
与整数数据的关系相同;您已经更改了类型,离更改字节顺序的目标还很远。将二进制信息从小结尾改为大结尾需要知道该信息的大小。如果只有短整数,则需要每两个字节左右翻转一次,但如果有普通(长)整数,则每个值有4个字节,并且需要反转每个4个字节。
我认为,使用
struct
模块是一种很好的方法,因为您必须指定值类型。下面将xx
解释为一个大端无符号短整型,然后将其打包回一个二进制表示形式,即一个小端无符号短整型:“\xFF”表示包含ASCII代码为255的字符的字符串。
例如:
print '\x41'
给出“A”(因为这是带有ASCII代码41的字符)xx.encode('hex')
和hex(struct.unpack('>H', xx)[0])
只是给出了字符串xx包含的ASCII代码的十六进制表示。 这意味着生成的字符串包含a到f或0到9之间的多个字符。相关问题 更多 >
编程相关推荐