Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中将0和1的字符串转换为字节_Python_String_Binary_Byte_Bit - Fatal编程技术网

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

在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 =

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

例如,如果我有一个长度为16的字符串:
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文件中,所以另一种方法是下载它并将其存储在主程序的同一目录中。