获取一个字节的低半字节并替换十六进制值

时间:2013-06-21 13:47:55

标签: c# binary

我需要用0替换十六进制值0xA,并且只获取十六进制值的低半字节。

enter image description here

这就是我现在所拥有的:

    private void ParseContactID(int ContactID_100, int ContactID_10, int ContactID_1)
    {
        // (A=0)

        string Hunderds = ContactID_100.ToString("X").Replace((char)0xA, '0');
        string Dozens = ContactID_10.ToString("X").Replace((char)0xA, '0');
        string Singles = ContactID_1.ToString("X").Replace((char)0xA, '0');


        int HunderdsLower = StringToHex(Hunderds) & 0x0F;
        int DozensLower = StringToHex(Dozens) & 0x0F;
        int SinglesLower = StringToHex(Singles) & 0x0F;
    }

我应该&用0x0F得到低半字节或0xF0?
有没有办法替换0xA而不先将其转换为字符串?

2 个答案:

答案 0 :(得分:3)

我认为你目前所拥有的代码并不符合你的想法 - (char)0xA是一个换行符,而不是字母'A',所以它不会替换任何东西(因为{ {1}}不会生成换行符。但是您怀疑字符串转换可以完全取消。

要获得较低的半字节,您需要与ToString("X")建立AND。至于0x0F0xA的转换,有几个选项,但是如果你可以确定较低的半字节只包含值0(0 - 10),那么你可以使用模运算符(0x0 - 0xA),如果我们模10,它将%转换为0,同时保持0-9不变的值:

0xA

答案 1 :(得分:2)

我认为你根本没有理由使用字符串转换。这可能只是:

int hundreds = (ContactID_100 & 0x0F) % 10;
int dozens = (ContactID_10 & 0x0F) % 10; // I wonder why "dozens" instead of "tens"... ?
int singles = (ContactID_1 & 0x0F) % 10;

int contactId = hundreds * 100 + dozens * 10 + singles; // assuming "dozens" is "tens"...

要获得较低的半字节,您只需要用& 0x0F掩盖顶部半字节。 为了使A = 0,模块化部门可以工作。请务必在the % has higher precedence than the &以后的()语句周围添加&

如果您不想使用%运算符,则if检查可能会更快:

int hundreds = ContactID_100 & 0x0F;
int dozens = ContactID_10 & 0x0F;
int singles = ContactID_1 & 0x0F;
if (hundreds == 10) { hundreds = 0; } // since 0xA is 10
if (dozens == 10) { dozens = 0; }
if (singles == 10) { singles = 0; }