C# 获取字节的下半字节并替换十六进制值

C# 获取字节的下半字节并替换十六进制值,c#,binary,C#,Binary,我需要将十六进制值0xA替换为0,并只获取十六进制值的较低半字节 这就是我目前的情况: 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 D

我需要将十六进制值0xA替换为0,并只获取十六进制值的较低半字节

这就是我目前的情况:

    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转换为字符串的情况下替换它?

我不认为您当前拥有的代码与您认为的一样-
(char)0xA
是换行符,而不是字母“a”,因此它不会替换任何内容(因为
是字符串(“X”)
不会产生换行符。但是,正如您所怀疑的,字符串转换可以完全取消

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

var hundreds = (ContactID_100 & 0x0F) % 10;

我不认为您当前拥有的代码做了您认为它做的事情-
(char)0xA
是换行符,而不是字母“a”,因此它不会替换任何东西(因为
ToString(“X”)
不会生成换行符。但是,正如您所怀疑的,字符串转换可以完全取消

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

var hundreds = (ContactID_100 & 0x0F) % 10;

我看不出您有任何理由使用字符串转换。这可能是:

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; }

我看不出您有任何理由使用字符串转换。这可能是:

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; }

是否要将字节12、13和14中的任何0xA(如果找到)替换为0?然后提取这三个字节中较低的半字节?这是您想要的吗?0xA是否可以存在于较高或较低的半字节中?是否要替换任何0xA(如果找到)在字节12、13和14中加0,然后提取这三个字节中较低的半字节?这是您想要的吗?0xA可以存在于较高或较低的半字节中吗?