Python 中的十进制转十六进制

5 投票
4 回答
4107 浏览
提问于 2025-04-16 03:15

我有一个可能有点傻的问题。我第一次在写入串口设备时遇到了一些困惑。我需要发送一个数据帧 [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, X, Y],其中 X 和 Y 是校验和的值。我了解到在使用 pyserial 模块时,需要把这个数据帧转换成字符串格式。这样做没问题,但我对格式有点搞不清楚。我试着这样做:

a = [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, X, Y]
send = "".join(chr(t) for t in a)

但我困惑的地方在于,当我用 chr 函数时,X 和 Y 变成了奇怪的字符串(假设是它们的 ASCII 表示)。比如说,如果 X 是 36,chr(X) 会变成 '$',而不是 '\x24'。有没有办法让我得到一个表示 '\xnn' 值的字符串,而不是 ASCII 码?让我困惑的是,12 和 7 能正确转换成 '\x0b' 和 '\x07'。我是不是漏掉了什么?

更新:
可能是我对串口写入的理解不够,或者我不知道我的设备到底需要什么。这是我正在使用的 C 代码的一部分:


fd=open("/dev/ttyS2",O_RDWR|O_NDELAY);
char buff_out[20]
//Next line is psuedo
for i in buff_out print("%x ",buff_out[i]); // prints b 0 0 0 0 0 0 0 9 b3 36 
write(fd,buff_out,11);  
sleep()
read(fd,buff_in,size);
for i in buff_in print("%x ",buff_in[i]); // prints the correct frame that I'm expecting


Python:



frame = [11, 0, 0, 0, 0, 0, 0, 0, 9] + [crc1, crc1]

senddata = "".join(chr(x) for x in frame)



IEC = serial.Serial(port='/dev/ttyS2', baudrate=1200, timeout=0)
IEC.send(senddata)

IEC.read(18) # number of bytes to read doesn't matter, it's always 0

我这样做对吗?显然你无法准确判断,因为这取决于设备,而我也不能提供太多具体信息。但这样格式是 serial.send() 期待的数据格式吗?

4 个回答

0

我猜你想要用到 struct 这个模块。

>>> import struct
>>> struct.pack('>B', 12)
'\x0c'
>>> vals = [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0xa, 0xb]
>>> ''.join(struct.pack('>B', x) for x in vals)
'\x0c\x00\x00\x00\x00\x00\x00\x00\x07\x00\n\x0b'
1

ASCII码为36的字符 '$'。你可以在任何ASCII表中查到这个信息。Python只会在字符不可打印的时候(比如控制字符等)显示十六进制转义。

从最底层来看,不管Python是以十六进制转义的方式显示,还是直接显示这个ASCII值对应的字符,底层的位模式都是一样的。

不过,你可能会想用一下struct模块,它可以帮你处理这些转换。

3

如果一个ASCII字节可以被打印出来,它通常会用单个字符来表示;如果不能打印,就会用\x??这种格式来表示。在这两种情况下,它们都代表一个字节,你可以用这两种方式来写字符串:

>>> '\x68\x65\x6c\x6c\x6f'
'hello'

不过,如果你使用的是Python 2.6或更新的版本,你可能会觉得使用内置的bytearray会更简单、更自然,而不是去搞ordstruct这些东西。

>>> vals = [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, 36, 100]
>>> b = bytearray(vals)
>>> b
bytearray(b'\x0c\x00\x00\x00\x00\x00\x00\x00\x07\x00$d')

你可以通过转换来把它变成str(在Python 3中是bytes),而且可以通过索引来从bytearray中获取整数。

>>> str(b)
'\x0c\x00\x00\x00\x00\x00\x00\x00\x07\x00$d'
>>> b[0]
12
>>> b[-1]
100

至于你的串行Python代码,我觉得没问题——我不太明白你为什么觉得有问题……

撰写回答