0

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

在此处输入图像描述

这就是我目前所拥有的:

    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 ?

4

2 回答 2

3

我认为您当前拥有的代码不会像您认为的那样 -(char)0xA是换行符,而不是字母“A”,所以它不会替换任何东西(因为ToString("X")不会产生换行符。作为您怀疑字符串转换可以完全取消。

要获得较低的半字节,您需要与0x0F. 至于 to 的转换0xA0有几个选项,但如果您可以确定下半字节将只包含值0x0 - 0xA(0 - 10),那么您可以使用模运算符 ( %),如果我们对 10 进行模运算,将转换0xA为 0,同时保持值 0 - 9 不变:

var hundreds = (ContactID_100 & 0x0F) % 10;
于 2013-06-21T14:06:37.267 回答
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,可以进行模除法。确保()围绕&语句放置,因为%优先级高于&.

如果您不想使用%运算符,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; }
于 2013-06-21T14:07:33.510 回答