【问题标题】:How to convert string to byte array in Python如何在 Python 中将字符串转换为字节数组
【发布时间】:2012-07-24 04:29:42
【问题描述】:

假设我有一个 4 个字符的字符串,并且我想将此字符串转换为字节数组,其中字符串中的每个字符都被转换为其十六进制等效值。例如

str = "ABCD"

我正在尝试让我的输出成为

array('B', [41, 42, 43, 44])

有没有一种简单的方法可以做到这一点?

【问题讨论】:

  • 你想要的东西是不可能的,至少不是这种精确的形式。 B 类型的字节数组包含 1 字节整数,它们始终以十进制表示。

标签: python


【解决方案1】:

encode 函数可以帮到你,encode 返回字符串的编码版本

In [44]: str = "ABCD"

In [45]: [elem.encode("hex") for elem in str]
Out[45]: ['41', '42', '43', '44']

或者你可以使用数组模块

In [49]: import array

In [50]: print array.array('B', "ABCD")
array('B', [65, 66, 67, 68])

【讨论】:

  • 但是如你所见,数组模块给出了一个字符串元素的 ascii 值,这与你的预期输出不匹配
  • 这是公认的答案,在 Python3 中不起作用。您能否像其他答案中指出的那样添加 python3 版本?
【解决方案2】:

只需使用bytearray(),它是一个字节列表。

Python2:

s = "ABCD"
b = bytearray()
b.extend(s)

Python3:

s = "ABCD"
b = bytearray()
b.extend(map(ord, s))

顺便说一句,不要使用str 作为变量名,因为它是内置的。

【讨论】:

  • @KevanAhlquist 我的错。现在修好了。
  • 对于 Python 3,这对我来说看起来更干净:s = "ABCD"b = bytearray()b.extend(s.encode())
  • 关于encode(),它返回一个自然扩展字节数组的字节对象。
  • map(ord, s) 将返回值 > 255,除非您的字符串是严格的 ASCII。请更新您的答案以包含s.encode('utf-8') 之类的内容。 (请注意,UTF-8 是 ASCII 的严格超集,因此它不会以任何方式改变 ASCII 字符串。)
  • @9000 使用.encode().encode('utf-8') 是不正确的。如果您不想转换字节,请使用map(ord, ...)repl.it/repls/MistySubtleVisitors 只需按 run 即可查看结果。
【解决方案3】:

获取字节数组的另一种方法是将字符串编码为 ascii:b=s.encode('ascii')

【讨论】:

  • 假设字符串以 ASCII 开头。如果你有 s = '\x80',那是行不通的。
  • 如果 s = '\x80' 怎么办?
【解决方案4】:

这对我有用(Python 2)

s = "ABCD"
b = bytearray(s)

# if you print whole b, it still displays it as if its original string
print b

# but print first item from the array to see byte value
print b[0]

参考: http://www.dotnetperls.com/bytes-python

【讨论】:

    【解决方案5】:

    这适用于 Python 2 和 3:

    >>> bytearray(b'ABCD')
    bytearray(b'ABCD')
    

    注意字符串以b开头。

    获取单个字符:

    >>> print("DEC HEX ASC")
    ... for b in bytearray(b'ABCD'):
    ...     print(b, hex(b), chr(b))
    DEC HEX ASC
    65 0x41 A
    66 0x42 B
    67 0x43 C
    68 0x44 D
    

    希望对你有帮助

    【讨论】:

      【解决方案6】:

      根据您的需要,这可以是一步或两步

      1. 使用encode()将字符串转换为字节,不可变
      2. 使用bytearray() 将字节转换为字节数组,可变
      s="ABCD"
      encoded=s.encode('utf-8')
      array=bytearray(encoded)
      

      以下验证在 Python 3.7 中完成

      >>> s="ABCD"
      >>> encoded=s.encode('utf-8')
      >>> encoded
      b'ABCD'
      >>> array=bytearray(encoded)
      >>> array
      bytearray(b'ABCD')
      

      【讨论】:

        【解决方案7】:
        s = "ABCD"
        from array import array
        a = array("B", s)
        

        如果你想要十六进制:

        print map(hex, a)
        

        【讨论】:

        • 在 repl.it 中不起作用。返回:“TypeError:不能使用 str 来初始化类型码为 'B' 的数组”
        【解决方案8】:

        由于没有一个答案在 Python 3 中完全产生 array('B', [41, 42, 43, 44])the answer by avasal 失败,我在这里发布我的替代方案:

        import array
        s = 'ABCD'
        a = array.array('B', [ord(c) for c in s])
        print(a)
        

        打印出来的

        array('B', [65, 66, 67, 68])
        

        请注意,65-68 是“ABCD”的正确 ASCII。

        【讨论】:

          【解决方案9】:

          对于 python 3,它适用于 @HYRY 发布的内容。我需要它来处理 dbus.array 中的返回数据。这是唯一有效的方法

          s = "ABCD"
          

          从数组导入数组

          a = array("B", s)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-07-09
            • 1970-01-01
            • 2013-05-08
            • 2015-08-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多