将十六进制字符转换为一串位(Python或Ruby)

将十六进制字符转换为一串位(Python或Ruby),python,ruby,hex,Python,Ruby,Hex,我有一个微控制器,它从HTTP API返回如下状态响应: <response><BS>026219AAF80F440206025019AAF816A944274480</BS></response> 最后两个字符(在本例中为80)表示一个十六进制值,我需要将其转换为二进制位10000000。每个位都是对应于该硬件上的状态的标志 为了检查8位中的每一位,我需要取字符串80。整个响应是一个字符串,我只需要抓取最后2个字符,并将其转换为二进制10000

我有一个微控制器,它从HTTP API返回如下状态响应:

<response><BS>026219AAF80F440206025019AAF816A944274480</BS></response>
最后两个字符(在本例中为80)表示一个十六进制值,我需要将其转换为二进制位10000000。每个位都是对应于该硬件上的状态的标志


为了检查8位中的每一位,我需要取字符串80。整个响应是一个字符串,我只需要抓取最后2个字符,并将其转换为二进制10000000的字符串表示形式,这样我就可以单独检查8个字符中的每一个

最好的办法是什么?我想用Python或Ruby来做,但我很高兴学习一下我要做的事情的一般技术,然后再解决它


注:我显然没有CS背景,所以这对我来说是陌生的。我可能使用了错误的命名法。请随时纠正我;我希望我能说出我要找的东西的要点。

在python中,您可以这样做:

>>yourbits = str(bin(int("026219AAF80F440206025019AAF816A944274480"[-2:],16))[2:]) 
>>print yourbits 
1000000
>>print yourbits[0]
'1'

[-2:]用于选择80,[2:]用于删除字符串二进制表示形式前面的1b。

在python中,可以执行以下操作:

>>yourbits = str(bin(int("026219AAF80F440206025019AAF816A944274480"[-2:],16))[2:]) 
>>print yourbits 
1000000
>>print yourbits[0]
'1'

[-2:]用于选择80,[2:]用于删除字符串二进制表示前面的1b。

如果只是测试单个位,则可以将其用作数字

>>> bool(int('80', 16) & 0x40)
False
>>> bool(int('80', 16) & 0x80)
True

如果您只是测试单个位,那么可以将其用作数字

>>> bool(int('80', 16) & 0x40)
False
>>> bool(int('80', 16) & 0x80)
True
在Ruby中:

yourbits = "026219AAF80F440206025019AAF816A944274480"[-2,2].to_i(16).to_s(2)
=> "10000000"
puts yourbits
10000000
=> nil
解释每个步骤-首先,对字符串进行切片以获得最后2个字符:

"026219AAF80F440206025019AAF816A944274480"[-2,2]
=> '80'
将其转换为整数:

"80".to_i(16)
=> 128
返回到字符串重新标记,以二进制表示:

128.to_s(2)
=> '10000000'
也许有一种更好或更容易混淆的方法,但我现在无法想象。

在Ruby中:

yourbits = "026219AAF80F440206025019AAF816A944274480"[-2,2].to_i(16).to_s(2)
=> "10000000"
puts yourbits
10000000
=> nil
解释每个步骤-首先,对字符串进行切片以获得最后2个字符:

"026219AAF80F440206025019AAF816A944274480"[-2,2]
=> '80'
将其转换为整数:

"80".to_i(16)
=> 128
返回到字符串重新标记,以二进制表示:

128.to_s(2)
=> '10000000'

可能有一种更好或更容易混淆的方法,但我现在无法想象。

在Python中解码十六进制的另一种方法是使用decode方法:


最后两个字符构成最后一个字节,可以使用数据[-1]访问该字节。如Ignacio所示,您可以使用&运算符测试单个位。

Python中解码十六进制的另一个选项是使用解码方法:


最后两个字符构成最后一个字节,可以使用数据[-1]访问该字节。正如Ignacio演示的那样,您可以使用&运算符测试单个位。

这不应该是.to_i be.to_i 16吗?十六进制80是十进制的128。建议的解决方案没有什么错,只是没有将“80”转换为基数16,而是假设它是基数10。使用“80”。改为“16”。我看到的唯一警告是,在to_s2期间可能会丢失字符串值,您可以使用string.format或%,例如:'%08b''%80'。to_i16=>10000000@chron-是的,你是对的,应该这样。不仅如此,而且没有。对我来说,如果不是80,而是0,它也会破裂。我会修好的。谢谢你指出。to_i16可以写成十六进制。不是吗。to_i是。to_i16?十六进制80是十进制的128。建议的解决方案没有什么错,只是没有将“80”转换为基数16,而是假设它是基数10。使用“80”。改为“16”。我看到的唯一警告是,在to_s2期间可能会丢失字符串值,您可以使用string.format或%,例如:'%08b''%80'。to_i16=>10000000@chron-是的,你是对的,应该这样。不仅如此,而且没有。对我来说,如果不是80,而是0,它也会破裂。我会修好的。感谢您指出。to_i16可以写为十六进制。为了检查8位中的每一位,我需要取字符串80。整个响应是一个字符串,我只需获取最后2个字符,并将其转换为二进制10000000的字符串表示形式,以便我可以单独检查8个字符中的每一个。-不,你真的不知道!为了检查8位中的每一位,我需要取字符串80。整个响应是一个字符串,我只需抓取最后2个字符,并将其转换为二进制10000000的字符串表示形式,以便我可以单独检查8个字符中的每一个不,你真的不知道!作为背景,这非常有用,但我应该提到,我只关心返回的8位中的4位。我没有硬件可以返回的所有两个字符的状态响应,因此我无法直接测试它们。好的,那么只测试这4个字符。作为背景,这非常有用,但我应该提到,我只关心返回的8位中的4位。我没有硬件可以返回的所有两个字符的状态响应,因此我无法直接测试它们。好的,那么只测试这4个字符。我要求提供Python和Ruby示例,这让我陷入了困境。这与上面的Ruby示例一样有帮助。非常感谢。我真的把自己逼到了墙角 询问Python和Ruby示例。这与上面的Ruby示例一样有帮助。非常感谢。