【问题标题】:Python Encoding IssuesPython 编码问题
【发布时间】:2015-07-02 22:16:17
【问题描述】:

我有要解码的数据及其在 Windows-1252 中的数据,基本上我将代码发送到套接字并将其发回,我必须解码消息并使用 IEEE-754 从中获取某个值但我似乎可以弄清楚所有这些编码的东西。这是我的代码。

def printKinds ():
    test = "x40\x39\x19\x99\x99\x99\x99\x9A"

    print (byt1Hex(test))
    test = byt1Hex(test).replace(' ', '')
    struct.unpack('<d', binascii.unhexlify(test))
    print (test)
printKinds()

def byt1Hex( bytStr ):
    return ' '.join( [ "%02X" % ord( x ) for x in bytStr ] )

所以我使用它,然后我必须从中获得价值。但它不起作用,我不知道为什么。

我得到的当前输出是

struct.unpack('<d', binascii.unhexlify(data))
struct.error: unpack requires a bytes object of length 8

我正在寻找的预期输出错误是 25.1 但是当我对其进行编码时,它实际上将字符串更改为错误的值,所以当我这样做时:

 print (byt1Hex(data))

我希望得到这个。

40 39 19 99 99 99 99 9A

但我实际上得到了这个

78 34 30 39 19 99 99 99 99 9A

【问题讨论】:

  • 提供一些我们可以实际运行的代码。向我们展示 byte1Hex 函数。
  • 什么不起作用?什么是预期输出?什么是实际输出? byt1Hex 是做什么的?
  • 将 cp1252 编码的文本解释为 IEEE-754 双精度值几乎没有意义:struct.unpack('!d', 'abcdefgh'.encode('cp1252'))
  • 为什么要把一个字节串转成十六进制串,却马上又转回来?
  • 我不确定我是新手,基本上我的过程是让数据解码,然后使用 IEEE-754 进行转换

标签: python encoding binary decoding


【解决方案1】:
>>> import struct
>>> struct.pack('!d', 25.1)
b'@9\x19\x99\x99\x99\x99\x9a'
>>> struct.unpack('!d', _) #NOTE: no need to call byt1hex, unhexlify
(25.1,)

您通过网络发送、接收字节。无需对它们进行 hexlify/unhexlify;除非协议要求它(你应该在问题中提到协议)。

【讨论】:

  • 但是我从主机得到数据“\x40\x39\x19\x99\x99\x99\x99\x9A”,看起来你改了?
  • @BSD_: 是一回事:b"@" == b"\x40"(如果你使用的是 Python 2,那么你将看不到 b 字节文字的前缀)
  • 呃,我不确定你怎么知道?
  • @BSD_:你不确定什么?我能说什么?
  • 我不确定我是十进制还是二进制哈哈这就是我问你的原因
【解决方案2】:

你有:

test = "x40\x39\x19\x99\x99\x99\x99\x9A"

你需要:

test = "\x40\x39\x19\x99\x99\x99\x99\x9A"

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2013-09-10
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多