【问题标题】:ValueError: invalid literal for int() with base 16: '\x0e\xa3' PythonValueError:int() 的无效文字,基数为 16:'\x0e\xa3' Python
【发布时间】:2012-08-06 09:57:04
【问题描述】:

我从串行端口获取代表 PIC 板上电压的字节。 但是我无法将这些字节(字符串)转换为十进制,因为我收到了上面的错误消息。 这里是函数(其实是和tkinter按钮关联的)

def channel8():
    ser.write(chr(0xFF))
    print "you have select channel8"
    x=ser.read(2)
    w=int(x, 16)
    print w
    print "Voltage on channel8 is:" , x

ValueError: int() 基数为 16 的无效文字:'\x0e\xa3'

def channel8():
    ser.write(chr(0xFF))
    print "you have select channel8"
    x=ser.read(2)
    z=struct.unpack("h", x)
    #w=int(z, 16)
    print z

我明白了:

通道 8 上的电压为:(28942,)

你能解释一下我是如何得到这个值的吗?它不匹配任何东西:D

【问题讨论】:

    标签: python string tkinter decimal pyserial


    【解决方案1】:

    我认为你应该使用struct 模块并像这样解压你的二进制数据:

    struct.unpack("h", x)
    

    因为int 并不是真正用于处理二进制数据,而是处理十六进制字符串,例如:EF1D

    当您执行x=ser.read(2) 时,您收到两个字节的二进制数据,struct 库支持两种类型的数字表示:short(h) 和unsigned short(H)。函数struct.unpack 接收两个参数:

    并返回一个包含未打包值的元组(在您的情况下只有一个 int)。

    所以你需要将字符串w=int(x, 16)更改为w = struct.unpack("h", x)[0]w = struct.unpack("H", x)[0],这取决于数据类型。

    【讨论】:

    • 示例 int 可以为无符号 ('H'),值为 41742,或有符号,值为 -23794..
    • 谢谢你的回答,你能解释一下吗?我是初学者:)
    • 太好了,我现在明白了,我把你的建议结果放在我的帖子中(我已经编辑过)它给了我一个十进制数,但它与结果不匹配。例如,0x0E6D 给了我 27918,它应该是 3693
    • 这意味着你需要 ">h" 或 ">H" 结构规范。这意味着使用大端字节序。
    • “h”和x应该代表什么?
    猜你喜欢
    • 2020-05-27
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2018-03-27
    相关资源
    最近更新 更多