繁体   English   中英

获得较低的半字节字节并替换十六进制值

[英]Get lower nibble of a byte and replace Hex value

我需要将十六进制值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',因此它不会替换任何内容(因为ToString("X")不会产生换行符,但是您已经怀疑完全可以完成字符串转换。

要获得较低的半字节,您需要与0x0F进行AND 0x0F 关于0xA0的转换,有几个选项,但是如果可以确定下半字节仅包含值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; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM