Python 格式十六进制数
Python format hex number
我需要通过 tcp 发送一个字符串。字符串的第一部分之一是命令变量的长度
Example:
command = STATUS?UPDATE
我需要在下面发送以下字符串
sendCommand = '\x00\x00\x00'+STRINGLENGTH+'\x02'+command+'\x0D\x0A'
我的字符串长度是 11,所以我需要 STRINGLENGTH 是 11 的十六进制等效值,即 0xB,除了我需要它输出为 \ x0B
用前导 0 填充它很容易,但我无法将其输出为 \x 而不是 0x,如果我做了一个字符串替换,它被视为文本而不是十六进制,所以它不起作用。
我最终的十六进制字符串应该是:
\x00\x00\x00\x0B\x02\x53\x54\x41\x54\x55\x53\x3f\x55\x53\x45\x52\x0D\x0A
我得到的是:
\x00\x00\x000x0B\x02\x53\x54\x41\x54\x55\x53\x3f\x55\x53\x45\x52\x0D\x0A
关于如何正确格式化它的任何想法?
所以,这有点迂回时尚,但使用 bytes
对象:
>>> STRINGLENGTH = bytes([11]).decode()
>>> endCommand = '\x00\x00\x00'+STRINGLENGTH+'\x02'
>>> endCommand
'\x00\x00\x00\x0b\x02'
几乎可以肯定,您会想要将 str
对象改回 bytes
对象,但上面的内容应该可以让您继续。
我怀疑你正在做的是使用 hex
函数:
>>> STRINGLENGTH = hex(11)
>>> endCommand = '\x00\x00\x00'+STRINGLENGTH+'\x02'
>>> endCommand
'\x00\x00\x000xb\x02'
您需要了解的最基本的事情是您不是在使用“十六进制”,而是在使用 字节。十六进制正是字节的传统表示方式。 hex
辅助函数 returns 十六进制表示, 作为整数的字符串 。但这不是你想要的。您想要 byte 对应于值 11.
请注意,对于 ascii 范围,chr(i)
也可能有效,因此
>>> STRINGLENGTH = chr(11)
>>> endCommand = '\x00\x00\x00'+STRINGLENGTH+'\x02'
>>> endCommand
'\x00\x00\x00\x0b\x02'
但是要小心,假设你想要数字 129,你必须关心编码...
>>> chr(129)
'\x81'
但以字节为单位,在 UTF-8 中,它实际上由两个不同的字节表示
>>> chr(129).encode()
b'\xc2\x81'
>>> list(chr(129).encode())
[194, 129]
当然,这取决于编码:
>>> chr(129).encode('latin')
b'\x81'
>>> list(chr(129).encode('latin'))
[129]
>>>
出于这个原因,我认为坚持使用稍微冗长的方式更安全:
>>> bytes([129])
b'\x81'
我需要通过 tcp 发送一个字符串。字符串的第一部分之一是命令变量的长度
Example:
command = STATUS?UPDATE
我需要在下面发送以下字符串
sendCommand = '\x00\x00\x00'+STRINGLENGTH+'\x02'+command+'\x0D\x0A'
我的字符串长度是 11,所以我需要 STRINGLENGTH 是 11 的十六进制等效值,即 0xB,除了我需要它输出为 \ x0B
用前导 0 填充它很容易,但我无法将其输出为 \x 而不是 0x,如果我做了一个字符串替换,它被视为文本而不是十六进制,所以它不起作用。
我最终的十六进制字符串应该是:
\x00\x00\x00\x0B\x02\x53\x54\x41\x54\x55\x53\x3f\x55\x53\x45\x52\x0D\x0A
我得到的是:
\x00\x00\x000x0B\x02\x53\x54\x41\x54\x55\x53\x3f\x55\x53\x45\x52\x0D\x0A
关于如何正确格式化它的任何想法?
所以,这有点迂回时尚,但使用 bytes
对象:
>>> STRINGLENGTH = bytes([11]).decode()
>>> endCommand = '\x00\x00\x00'+STRINGLENGTH+'\x02'
>>> endCommand
'\x00\x00\x00\x0b\x02'
几乎可以肯定,您会想要将 str
对象改回 bytes
对象,但上面的内容应该可以让您继续。
我怀疑你正在做的是使用 hex
函数:
>>> STRINGLENGTH = hex(11)
>>> endCommand = '\x00\x00\x00'+STRINGLENGTH+'\x02'
>>> endCommand
'\x00\x00\x000xb\x02'
您需要了解的最基本的事情是您不是在使用“十六进制”,而是在使用 字节。十六进制正是字节的传统表示方式。 hex
辅助函数 returns 十六进制表示, 作为整数的字符串 。但这不是你想要的。您想要 byte 对应于值 11.
请注意,对于 ascii 范围,chr(i)
也可能有效,因此
>>> STRINGLENGTH = chr(11)
>>> endCommand = '\x00\x00\x00'+STRINGLENGTH+'\x02'
>>> endCommand
'\x00\x00\x00\x0b\x02'
但是要小心,假设你想要数字 129,你必须关心编码...
>>> chr(129)
'\x81'
但以字节为单位,在 UTF-8 中,它实际上由两个不同的字节表示
>>> chr(129).encode()
b'\xc2\x81'
>>> list(chr(129).encode())
[194, 129]
当然,这取决于编码:
>>> chr(129).encode('latin')
b'\x81'
>>> list(chr(129).encode('latin'))
[129]
>>>
出于这个原因,我认为坚持使用稍微冗长的方式更安全:
>>> bytes([129])
b'\x81'