我有一个微控制器从HTTP API返回这样的状态响应:
<response><BS>026219AAF80F440206025019AAF816A944274480</BS></response>
最后两个字符,在本例中为80
,表示我需要转换为其二进制位10000000
的十六进制值。每个位都是一个标志,对应于该硬件上的状态。
对于我来检查每个8位,我需要取字符串80
(整个响应是一个字符串,我只抓取最后2个字符)并将其转换为二进制的字符串表示形式10000000
所以我可以分别检查每个8个字符。
最好的方法是什么?我想用Python或Ruby来做,但我很高兴学习我想要做的一般技术,然后弄明白。
注意:我(显然)没有CS背景,所以这对我来说很陌生。我可能会使用错误的命名法。请随意纠正我;我希望我得到了我正在寻找的要点。
答案 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”。