C# 获取字节的下半字节并替换十六进制值
我需要将十六进制值0xA替换为0,并只获取十六进制值的较低半字节 这就是我目前的情况: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
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可以存在于较高或较低的半字节中吗?