将Hex Chars转换为比特串(Python或Ruby)

时间:2011-10-12 03:37:44

标签: python ruby hex

我有一个微控制器从HTTP API返回这样的状态响应:

<response><BS>026219AAF80F440206025019AAF816A944274480</BS></response>

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

对于我来检查每个8位,我需要取字符串80(整个响应是一个字符串,我只抓取最后2个字符)并将其转换为二进制的字符串表示形式10000000所以我可以分别检查每个8个字符。

最好的方法是什么?我想用Python或Ruby来做,但我很高兴学习我想要做的一般技术,然后弄明白。

注意:我(显然)没有CS背景,所以这对我来说很陌生。我可能会使用错误的命名法。请随意纠正我;我希望我得到了我正在寻找的要点。

4 个答案:

答案 0 :(得分:5)

在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

以二进制表示形式返回字符串againg:

128.to_s(2)
=> '10000000'

可能有更好(或更少混乱)的方式,但我现在无法想象。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

data = "026219AAF80F440206025019AAF816A944274480".decode("hex")

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

答案 3 :(得分:1)

在python中你可以这样做:

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

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