[英]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)
如果您需要对位串执行任何操作,您可能希望使用第三方模块,如bitarray
或bitstring
,这样可以创建可被视为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.