在Python中将0和1的字符串转换为字节
我有一个二进制整数的字符串表示,我需要具有精确位结构的字节,以便通过套接字发送 例如,如果我有一个长度为16的字符串:在Python中将0和1的字符串转换为字节,python,string,binary,byte,bit,Python,String,Binary,Byte,Bit,我有一个二进制整数的字符串表示,我需要具有精确位结构的字节,以便通过套接字发送 例如,如果我有一个长度为16的字符串:0000111100010,那么我需要两个相同位结构的字节。在这种情况下,第一个字节的int值应为15,第二个字节的int值应为10。它们是否可以以ascii格式打印并不重要。我怎么得到它 我尝试了以下方法,该方法以0xf0xa的形式创建字节。但是它的大小是6字节而不是2字节 def getByte(s): if(len(s) != 8): return b =
0000111100010
,那么我需要两个相同位结构的字节。在这种情况下,第一个字节的int值应为15
,第二个字节的int值应为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)
def getByte(s):
如果(len)(s)!=8:
返回
b=b'0'
对于s中的c:
b=(int(b)| int(c))&0x0000ff#这使b成为一个整数
b=b>1#因为多了一班
b=hex(b).encode('utf-8')#否则如何从int返回字节?
返回(b)
此方法接受长度为8的字符串,并打算给出具有相同内部位结构的字节,但失败。(我需要类似于C
中的strtol
的东西)
是否需要帮助?首先,如果您将位字符串作为文字值,只需将其设置为base-2 int文字,而不是字符串文字:
value = 0b0000111100001010
如果您有非文字位字符串,并且只需将它们解析为整数,那么,正如martineau在注释中所说,内置构造函数就是您所需要的,正如martineau所说,因为它将
base
作为可选的第二个参数:
value = int('0000111100001010', 2)
如果您需要对位字符串进行任何处理,您可能需要使用第三方模块,如or,它允许您创建可以被视为1和0字符串、布尔序列、整数等的对象:
value = bitstring.BitArray(bin='0000111100001010')
一旦你有了一个整数,你可以把它打包成2个字节,就像martineau在评论中解释的那样:
my_bytes = struct.pack('!H', value)
代码>表示“网络端”。如果需要小端或本机端(或大端,当然与网络端相同,但可能是描述某些上下文的更有意义的方式),请参阅。H
意味着将其打包为一个C无符号短字符
——即两个字节
但如果您使用的是第三方模块,它可能有一些更简单的功能。例如,如果您有上一示例中的位字符串.位数组
:
my_bytes = value.tobytes()
转换二进制字符串数据的一种简单方法是使用内置的int()
函数,告诉它数字是以2为基数的二进制,而不是默认的以10为基数的十进制格式:
int('0000111100001010', 2)
这将返回一个整数值。要将其转换为一个字节字符串,您可以在struct
模式下使用pack()
函数,并使用'H'
格式字符串将数据参数告知它一个短的(2字节)无符号整数:
struct.pack('!H', int('0000111100001010', 2))
由于您希望通过网络套接字发送此消息,我还添加了一个“!”代码>前缀,表示返回的字节应为“网络”或大端字节顺序,而不是计算机的本机格式(可能不同)
注意:为示例返回的字符串将是'\x0f\n'
。结尾的'\n'
是因为字节值0x0a
恰好是一个ASCII换行字符,所以Python在显示包含一个字符串的repr()
时会以这种方式表示它们(这是Python交互控制台在每个表达式后自动执行的操作)。int('000011000010',2)
。您可以使用hex(int('000011100001010',2))
验证返回的值。我需要字节。非int.struct.pack('!H',int('000011100001010',2))
提供b'\n\x0f'
。不知怎的,低字节丢失了<代码>“\n”
是0x0a
。不管您真正想要的是“\x0f\n”
,它是大端字节顺序或网络字节顺序(如上面我更新的struct.pack
注释中所示)。感谢您的解释。我曾将其他库用作位字符串。但目前第三方库由于某种原因不能使用。@gaganbm:你说“目前第三方库由于某种原因不能使用”是什么意思?当您尝试安装它们时,是否会从pip
中得到错误;当您尝试导入它们时,是否会从python
中得到错误;当您在会议上提到它们时,是否会从您的老板/教授/其他人那里得到错误?如果是这样,请发布您老板的完整回溯,以便我们可以调试他。:)@哦,我的意思是说我没有权利在我使用的系统中安装东西。更多的行政性疼痛:“@ GGAANBM:您可能需要考虑使用和/或/或某种类型的代码> CXYRIGE/<代码> > PY2EXE< /代码> /<代码> PY2APP样式封装的分发来解决这个问题。(事实上,在许多情况下,即使您在所有目标机器上都有root/admin权限,这也是一个好主意。)@abarnert:您根本不需要安装bitstring—它都在一个.py文件中,所以另一种方法是下载它并将其存储在主程序的同一目录中。