【问题标题】:How to convert a Python string representing bytes into actual bytes?如何将表示字节的 Python 字符串转换为实际字节?
【发布时间】:2010-07-19 15:50:44
【问题描述】:

我有一个类似“01030009”的字符串,我想获得另一个字符串(因为在 Python 2.x 中我们使用字符串表示字节)newString 会产生这个结果:

for a in newString:
    print ord(a)

0
1
0
3
0
0
0
9

谢谢

【问题讨论】:

    标签: python


    【解决方案1】:
    ''.join(chr(int(x)) for x in oldString)
    

    chrord 的倒数。

    【讨论】:

    • chr、int 和生成器表达式,我认为这是内置的,你会得到:) 如果你的意思是更短的东西,或者单个函数,答案也是“不” .它会过度专业化,而 Python 倾向于尽可能避免这种情况。
    • 如果 oldString 有 hexa 值,比如 f 怎么办? int('f') 失败。
    • 如果您希望转换十六进制(或一些更高基数的可编码字母数字),则将基数传递给int()。您最多可以达到 36 个:int(x, 36)
    【解决方案2】:

    所有“深度内置”的方式都以不同于您想要的方式将字符解释为字节,因为您似乎希望的方式似乎仅限于表示价值小于 10 的字节(如果您打算使用,则小于 16十六进制,只是完全忘记提及它)。换句话说,您想要的代码可以代表字节字符串的极小部分,因此以任何方式“官方化”(例如以内置方式支持它)都是荒谬的!

    例如,考虑长度为 8 的字符串(您的示例的短长度),存在的该长度的字节字符串的总数为256 ** 8,而您选择的符号可以代表10 ** 8。即……:

    >>> exist = 256 ** 8
    >>> repre = 10 ** 8
    >>> print exist, repre
    18446744073709551616 100000000
    >>> print (repre / float(exist))
    5.42101086243e-12
    >>> 
    

    那么,为什么您会期望任何形式的“内置”官方支持,即使对于如此非常短的字符串,也只能表示大约十亿分之一的可能字节字符串的千分之五?! “特殊情况”这个词是为比这更频繁地发生的事情发明的(如果你每秒得到一个随机的 8 字节字符串,那么在你最终得到一个可以在你的方案),当然,更长的字节串会以指数方式加剧这种影响。

    有许多“官方”的字节串表示方案,例如base64RFC 3548 中指定的朋友...您想要的方案非常明显不是在其中;- )。 那些当然是在 Python 中获得“官方”内置支持的方案。

    【讨论】:

    • 谢谢。但我可能会说我的示例字符串长度为 8 只是偶然。
    • @Juanjo,当然,但是如果长度为 10 而不是 8,则您的方法可以表示的字节字符串的分数将减少其他数百倍,等等。“即使对于如此短的字符串” ,正如我所说——随着字符串长度变得现实,情况变得更糟!-)
    【解决方案3】:

    品种:

    import string
    newString = oldString.translate(string.maketrans('0123456789',
                    '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      相关资源
      最近更新 更多