【问题标题】:Working with bytes in Python 2.7在 Python 2.7 中使用字节
【发布时间】:2015-09-23 13:01:52
【问题描述】:

我正在尝试在 Python 中组装一个字节数组以获得类似于以下内容的签名:

  • 4 个字节,表示字符串 A 的长度,以字节为单位。
  • 字符串 A
  • 4 个字节,表示字符串 B 的长度,以字节为单位。
  • 字符串 B
  • 4 个字节,表示 Long A 值的长度(以字节为单位)。
  • 龙阿

字符串 A + B 是 utf-8,我使用 unicode(string, 'utf-8') 将其转换为 utf-8

我尝试将每个项目转换为字节数组并使用加号将它们连接起来,例如

bytearray(len(a)) + bytearray(a, "utf-8")...

我也尝试过使用 struct.pack,例如

struct.pack("i", len(a)) + bytearray(access_token, "utf-8")...

但似乎没有任何东西可以生成有效的签名。这是在Python中制作上述字节数组的正确方法吗?

【问题讨论】:

  • 你怎么知道签名无效?
  • 请发布一些示例数据。
  • FWIW, unicode(some_string, 'utf-8') 将字节字符串 some_string 转换为 Unicode 字符串。 'utf-8' 参数表示源字符串以 utf-8 编码。
  • 您还应该提及这些长度值是否需要格式化为大端或小端。我认为这是针对某些网络事物,因此您可能需要大端序,但明确一点是很好的。 :)

标签: python bytearray


【解决方案1】:

最后一个问题是关于 4 字节长度的字节顺序,但是您可以使用 struct 模块轻松控制它。

我会用

def dopack(A, B, LongA):
    fmt='!'  # for network order, use < for little endian, > for big endian, = for native
    fmt += 'i'

    buf = pack(fmt, len(A))
    buf += A
    buf += pack(fmt, len(B))
    buf += B
    b = bytes(LongA)
    buf += pack(fmt, len(b))
    buf += B

这样,LongA 值是用 ASCII 编码的,但更简单,你可以直接将 int(b) 转换回 long。

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 2012-06-04
    • 2012-01-18
    • 2018-07-19
    相关资源
    最近更新 更多