首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中不同十六进制类型/表示之间的差异

Python中不同十六进制类型/表示之间的差异
EN

Stack Overflow用户
提问于 2012-10-29 22:44:29
回答 2查看 16.7K关注 0票数 20

通过一些Python代码,我注意到十六进制值有许多不同的表示形式。例如,如果我像这样选择一个数字:

代码语言:javascript
复制
xx = '\x03\xff'

然后是下面的命令(我正在使用的一个版本将小端转换为大端)

代码语言:javascript
复制
yy = hex(struct.unpack('>H', xx)[0])

将返回:

代码语言:javascript
复制
'0x3ff'

但是,此命令

代码语言:javascript
复制
zz = xx.encode('hex')

将返回:

代码语言:javascript
复制
'03ff'

最后,仅打印输出的值将返回以下内容

代码语言:javascript
复制
'\x03\xff'

从它的外观来看,有三种不同类型的十六进制。

  1. '\xFF'
  2. '0xFF'
  3. 'FF'

有什么不同?

如果有人可以建议一种更好的方法将小端数字转换为大端数字,会给出的加分。上面的yy方法对大于两个字节的数字不起作用,我正在处理一些16字节长的十六进制字符串(包括与ascii/整数值不对应的值)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-29 23:09:44

任何使用\x的代码都是字符串转义代码,它恰好使用十六进制表示法;其他转义代码包括表示换行符的\n、表示文字引号的\'等。python字符串是一个字节序列,您可以使用这些字符指定ASCII可打印范围之外的文字值。当Python在解释器中回显字符串值时,或者您在字符串上打印repr()调用的结果时,Python将使用这样的转义来表示任何不能打印为ASCII码字符的字节:

代码语言:javascript
复制
>>> chr(65)
'A'
>>> chr(11)
'\x0b'

.encode('hex')一样,hex()函数返回一个非常具体的字符串表示,不同之处在于前者包含0x前缀。还有另外两种方法可以生成这样的字符串表示:使用'%x''%X'字符串格式化程序,它们使用小写或大写字母作为表示。

代码语言:javascript
复制
>>> hex(11)
'0xb'
>>> '\x0b'.encode('hex')
'0b'
>>> '%x' % (11,)
'b'
>>> '%X' % (11,)
'B'

这些都是字符串表示(一系列ASCII字符),与原始数据的关系与str(number)与整数数据的关系相同;您已经更改了类型,并且离更改字节顺序的目标更远了。

要将一段二进制信息从小端更改为大端,您需要知道该信息的大小。如果你所拥有的都是短整数,那么你需要每两个字节翻转一次,但是如果你有正常的(长)整数,那么你每个值有4个字节,你需要颠倒每4个字节。

我认为使用struct模块是一种很好的方法,因为您必须指定值类型。下面的代码将xx解释为一个大端无符号短整数,然后将其打包成一个二进制表示形式,作为一个小端无符号短整数:

代码语言:javascript
复制
>>> import struct
>>> xx = '\x03\xff'
>>> struct.pack('<H', *struct.unpack('>H', xx))
'\xff\x03'
票数 9
EN

Stack Overflow用户

发布于 2012-10-29 23: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之间的多个字符。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13123877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档