【问题标题】:Convert Python str/unicode object to binary/hex blob将 Python str/unicode 对象转换为二进制/十六进制 blob
【发布时间】:2011-10-07 08:53:21
【问题描述】:

有没有一种简单的方法可以将一些 str/unicode 对象表示为大二进制数(或十六进制数)?

我一直在阅读相关问题的一些答案,但它们都不适用于我的场景。

我尝试使用 STL 中的 struct 模块,但它没有按预期工作。字符,就像在二进制文件中一样显示为字符。

我在尝试一些不可能的事情吗?

例子:

def strbin(inp):
    # sorcery!
    return out

>> print strbin("hello")
# Any of these is cool (outputs are random keystrokes)
0b1001010101010000111001110001...
0xad9f...

【问题讨论】:

  • 你想得到一个整数还是十六进制/二进制表示的字符串?在您的示例中,您将整数作为二进制和十六进制文字给出。
  • @Peter,在我想到的大多数使用场景中,我会说一个整数。这只是为了我几天前想的一些愚蠢的压缩算法,只是为了好玩。

标签: python string unicode binary


【解决方案1】:

你可以试试bitarray:

>>> import bitarray
>>> b = bitarray.bitarray()
>>> b.fromstring('a')
>>> b
bitarray('01100001')
>>> b.to01()
'01100001'
>>> b.fromstring('pples')
>>> b.tostring()
'apples'
>>> b.to01()
'011000010111000001110000011011000110010101110011'

【讨论】:

  • 我不能给你和upvote senderle(还剩下4个声望)但你的答案就是我想要的。将此作为已接受的答案进行检查:) 非常感谢。
  • 我还要提一下bitstring,我认为它更通用一点,但它是纯Python,所以速度较慢。
  • 没有任何 STL 库可以做到这一点,对吧?只是好奇。 编辑:哦,你得到了上船。
  • @ratnushock,好吧,一旦你拥有一个int,你就可以调用bin。但这并没有填充字节,所以它不能很好地连接。 (hex 也不填充;hex(5) 返回 '0x5'。)JBernardo's answer 得到了正确的填充,并且与我能从标准库中想到的任何东西一样好。
【解决方案2】:
def strhex(str):
    h=""
    for x in str:
        h=h+(hex(ord(x)))[2:]
    return "0x"+h

【讨论】:

  • 这将返回 ASCII 数字而不是二进制 repr,但它的工作方式类似......感谢您的回答!
  • 以上答案不也返回ASCII吗?如果需要 int,可以在末尾添加 int(h,16)。
【解决方案3】:

非常简单,不需要 pypi 的模块:

def strbin(s):
    return ''.join(format(ord(i),'0>8b') for i in s)

您需要 Python 2.6+ 才能使用它。

【讨论】:

  • 嗯,我很确定 @senderle 的答案会更快,因为它是 C 扩展,但是 STL 解决方案也很棒。感谢您的回答!
  • 可能你不需要它那么快。否则你为什么要用 Python 编写呢?引用禅宗:简单胜于复杂
【解决方案4】:

我编写的一个较大的漂亮打印函数的切片,它以十六进制打印 ascii 代码。只是上一个答案功能的更 Pythonic 版本。此外,它适用于具有单个数字 ascii 代码的字符。

def strhex(string, start = '0x'):
    return start + ''.join(('{:x}'.format(ord(char))).zfill(2) for char in string)

【讨论】:

    【解决方案5】:

    这基本上是Ravi's answer,但有一个小错误修复,所以所有功劳归于他,但审稿人的共识是,这改变太大了,不能只进行编辑,应该是一个单独的答案......不知道为什么。

    def strhex(str):
        h=""
        for x in str:
            h=h+("0" + (hex(ord(x)))[2:])[-2:]
        return "0x"+h
    

    不同之处在于,在第 4 行,您必须检查字符是否小于 0x10,在这种情况下添加一个零,否则例如0x1101 变成 0x111。

    【讨论】:

      猜你喜欢
      • 2020-02-06
      • 2016-09-15
      • 2012-06-26
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 2016-08-28
      相关资源
      最近更新 更多