繁体   English   中英

在Python中将0和1的字符串转换为字节

[英]Convert string of 0s and 1s to byte in Python

我有一个二进制整数的字符串表示,我需要具有精确位结构的字节,通过套接字发送。

例如,如果我有一个长度为16: 0000111100001010的字符串,那么我需要2个字节的相同位结构。 在这种情况下,第一个字节的int值应为15 ,第二个字节的值应为10 它们是否可以用ascii格式打印并不重要。 我怎么得到它?

我尝试了以下方法,它以0xf0xa的形式创建字节。 但这个大小为6个字节而不是2个字节。

def getByte(s):
  if(len(s) != 8):
    return
  b = b'0'
  for c in s:
    b = (int(b) | int(c)) & 0x0000ff #This makes b an integer
    b = b << 1
  b = b >> 1 #because of 1 extra shift
  b = hex(b).encode('utf-8') #how else can I get back to byte from int?

  return(b) 

此方法采用长度为8的字符串,并打算提供相同内部位结构的字节,但失败。 (我需要类似于C strtol 。)

有什么帮助吗?

首先,如果您将位字符串作为文字值,只需将其设为base-2 int literal,而不是字符串文字:

value = 0b0000111100001010

如果您有非文字位字符串,并且您需要做的就是将它们解析为整数,那么,正如martineau在注释中所说,内置的int构造函数就是您所需要的,正如martineau所说,因为它需要一个base作为可选的第二个参数:

value = int('0000111100001010', 2)

如果您需要对位串执行任何操作,您可能希望使用第三方模块,如bitarraybitstring ,这样可以创建可被视为1和0的字符串,布尔序列,整数,等等。:

value = bitstring.BitArray(bin='0000111100001010')

一旦你有一个整数,你可以用struct将它打包成2个字节,因为martineau也在评论中解释:

my_bytes = struct.pack('!H', value)

! 意思是“网络端”。 如果您想要little-endian或native-endian(或big-endian,当然它与network-endian相同,但可能是描述某些上下文的更有意义的方式),请参阅字节顺序,大小和对齐 H表示将其打包为C unsigned short - 即两个字节。


但是,如果您使用的是第三方模块,它可能会更简单。 例如,如果您有上一个示例中的bitstring.BitArray

my_bytes = value.tobytes()

转换二进制字符串数据的简单方法就是使用内置的int()函数并告诉它数字是基数为2的二进制而不是默认的基数10十进制格式:

int('0000111100001010', 2)

这将返回一个整数值。 要将其转换为字节字符串,可以在struct模式下使用pack()函数,并使用格式字符串'H'将数据参数告诉它为short (2字节)无符号整数:

struct.pack('!H', int('0000111100001010', 2))

既然您想通过网络套接字发送,我还添加了一个'!' prefix,表示返回的字节应该是“network”或big-endian字节顺序,而不是计算机的本机格式(可能不同)。

请注意,为示例返回的字符串将为'\\x0f\\n' 最后的'\\n'是因为字节值0x0a恰好是一个ASCII换行符,所以Python在显示包含一个字符串的字符串的repr()时表示它们(这是Python交互式控制台之后的作用)每个表达式自动)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM