【问题标题】:Convert Hex Chars into a String of Bits (Python or Ruby)将十六进制字符转换为位串(Python 或 Ruby)
【发布时间】:2011-10-12 03:37:44
【问题描述】:

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

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

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

为了检查 8 位中的每一个,我需要获取字符串 80(整个响应是一个字符串,我只抓取最后 2 个字符)并将其转换为二进制 @987654325 的字符串表示@ 所以我可以单独检查 8 个字符中的每一个。

解决这个问题的最佳方法是什么?我想用 Python 或 Ruby 来做这件事,但我很高兴学习我想要做的一般技术,然后弄清楚。

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

【问题讨论】:

  • "为了让我检查 8 位中的每一个,我需要获取字符串 80(整个响应是一个字符串,我只抓取最后 2 个字符)并将其转换为字符串表示二进制 10000000,所以我可以单独检查 8 个字符中的每一个。” - 不,你真的没有!

标签: python ruby hex


【解决方案1】:

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

可能有更好的(或不那么令人困惑的)方法,但我现在无法想象。

【讨论】:

  • 不应该是 .to_i 是 .to_i(16) 吗?十六进制的 80 是十进制的 128。
  • 建议的解决方案没有任何问题,除了您未能将“80”转换为基数 16,而是让 to_i 假设它是基数 10。改用 '80'.to_i(16)。我看到的唯一警告是在to_s(2) 期间可能会丢失字符串值,您可以使用String.format% 进行修复,例如:'%08b' % '80'.to_i(16) =&gt; "10000000"
  • @chron -- 是的,你是对的,它应该。不仅如此,如果没有 .to_i(16),如果我们有一个“0F”而不是“80”,它也会中断。会修复。感谢您指出这一点。
  • to_i(16)可以写成hex
【解决方案2】:

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

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

【讨论】:

  • 这作为背景非常有用,但我应该提到我只关心返回的 8 位中的 4 位。我没有硬件可以返回的所有两字符状态响应,因此我无法直接测试它们。
  • 好的,那就只测试这 4 个。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    在python中你可以这样做:

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

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

    【讨论】:

    • 我真的把自己放在了一个角落,要求提供 Python 和 Ruby 示例。这与上面的 Ruby 示例一样有用。谢谢!
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2020-06-20
    • 2016-08-09
    • 2012-01-11
    • 2018-01-31
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    相关资源
    最近更新 更多