我需要用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而不先将其转换为字符串?
答案 0 :(得分:3)
我认为你目前所拥有的代码并不符合你的想法 - (char)0xA
是一个换行符,而不是字母'A',所以它不会替换任何东西(因为{ {1}}不会生成换行符。但是您怀疑字符串转换可以完全取消。
要获得较低的半字节,您需要与ToString("X")
建立AND。至于0x0F
到0xA
的转换,有几个选项,但是如果你可以确定较低的半字节只包含值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; }