【问题标题】:Assign a hex value to the low nibble of a byte将十六进制值分配给字节的低半字节
【发布时间】:2017-11-11 09:09:45
【问题描述】:

我正在做一个集成,我有一个字段的以下条件:

如果数据的长度是奇数,最后一个字节的低半字节被赋值为十六进制“F”。这个用于填充的十六进制“F”确保整个字节数用于字段并且不包含在项目的长度中。

我尝试附加十六进制 F,但这是错误的:

data << "%X" % 15

我想我需要获取最后一个字节并对它执行一些魔法,可能是一些按位运算:

low_nibble = data.bytes.last.get_low_nibble
low_nibble = transform_low_nibble_to_hex
data << low_nibble

如果有人能指出我正确的方向,我会很高兴。

【问题讨论】:

    标签: ruby encoding hex byte nibble


    【解决方案1】:

    0xF 的二进制表示是0b1111。方便的是,这都是1s,确保位是1的简单方法是OR1。因此,确保半字节中的所有位都是1 的简单方法是将半字节OR0b1111 / 0xF / 15

    访问单个半字节通常不方便,但幸运的是,还有一种简单的方法可以确保位保持原样:OR0。因此,为了保证字节的第一个半字节不变,我们需要OR第一个半字节为0b0000,并确保最后一个半字节为0xF,我们需要OR它与0b1111.

    把所有这些放在一起,我们需要用0b00001111/0x0F(就是0b1111/0xF)来OR整个最后一个八位字节:

    data.bytes.last |= 0xF
    

    【讨论】:

    • 感谢您的澄清,解释得很好,我想我掌握了大意。不幸的是,目前我无法对此进行测试,但是我明天将对其进行测试,希望这是我需要的解决方案。
    • 我今天测试了它,不得不在我这边进行一些调整,但核心逻辑是你在这里解释的逻辑。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多