Python 3.7字符重构 我对Python非常陌生(有C、C++、java脚本经验),在pythPythPython 3.7上遇到了奇怪的行为 我有一段代码,它通过TxBuffer计算xmodem CRC并将其添加到缓冲区,但不知何故添加了一个额外的字符 TxBuffer = command + str(inverter) CRC = CRCCCITT().calculate(TxBuffer) print(hex(CRC)) # >>> prints 0x29b6 CRCstr = chr((CRC >> 8) & 0xff) CRCstr += chr((CRC >> 0) & 0xff) print(CRCstr) # >>> prints )¶ TxBuffer += CRCstr # TxBuffer += chr((CRC >> 8) & 0xff) # TxBuffer += chr((CRC >> 0) & 0xff) #line inserts \xc2 character TxBuffer += "\r" print(binascii.hexlify(TxBuffer.encode())) # >>>prints b'5e503030375047533029c2b60d'

Python 3.7字符重构 我对Python非常陌生(有C、C++、java脚本经验),在pythPythPython 3.7上遇到了奇怪的行为 我有一段代码,它通过TxBuffer计算xmodem CRC并将其添加到缓冲区,但不知何故添加了一个额外的字符 TxBuffer = command + str(inverter) CRC = CRCCCITT().calculate(TxBuffer) print(hex(CRC)) # >>> prints 0x29b6 CRCstr = chr((CRC >> 8) & 0xff) CRCstr += chr((CRC >> 0) & 0xff) print(CRCstr) # >>> prints )¶ TxBuffer += CRCstr # TxBuffer += chr((CRC >> 8) & 0xff) # TxBuffer += chr((CRC >> 0) & 0xff) #line inserts \xc2 character TxBuffer += "\r" print(binascii.hexlify(TxBuffer.encode())) # >>>prints b'5e503030375047533029c2b60d',python,concatenation,Python,Concatenation,所以,我无法解释为什么我的数据中添加了“c2”字符 最好的祝愿,在Python3中,chr创建了一个Unicode字符。对encode的调用将转换为字节字符串,但必须使用编码。只有一种编码在Unicode代码点和字节值之间有1对1的对应关系,那就是'latin1'。默认值可能是'utf-8',它将一些代码点转换为多字节序列 正如其中一条评论中所建议的,在这种情况下,最好从一开始就使用字节字符串,完全避免使用Unicode TxBuffer = TxBuffer.encode() CRC = CR

所以,我无法解释为什么我的数据中添加了“c2”字符


最好的祝愿,

在Python3中,
chr
创建了一个Unicode字符。对
encode
的调用将转换为字节字符串,但必须使用编码。只有一种编码在Unicode代码点和字节值之间有1对1的对应关系,那就是
'latin1'
。默认值可能是
'utf-8'
,它将一些代码点转换为多字节序列

正如其中一条评论中所建议的,在这种情况下,最好从一开始就使用字节字符串,完全避免使用Unicode

TxBuffer = TxBuffer.encode()
CRC = CRCCCITT().calculate(TxBuffer)
print(hex(CRC))   # prints 0x29b6

CRCstr = bytes([(CRC >> 8) & 0xff, (CRC >> 0) & 0xff])
print(CRCstr)   # prints b')\xb6'

TxBuffer += CRCstr
TxBuffer += b"\r"
print(binascii.hexlify(TxBuffer))   # prints b'5e503030375047533029b60d'

请提供一个。
.encode()
调用包含原始二进制数据的“字符串”是非常不合适的。在Python3.x中,您应该始终使用
字节
,而不是
str
。您应该查看内置的
结构
模块,以便在整数及其二进制表示形式之间进行转换,而不是手动转换。
c2
不是字符串中的字符,
\xc2
是字符谢谢标记,你的建议奏效了。我在“print(binascii.hexlify(TxBuffer))”后面的一行执行了.encode(),这是一个串行的.write(TxBuffer.encode())。