gpt4 book ai didi

c# - 如何从十六进制字符串中获取位范围并将其转换为整数?

转载 作者:行者123 更新时间:2023-12-04 07:16:33 24 4
gpt4 key购买 nike

我问这个问题,因为找不到针对这种特殊情况的解决方案。
我需要从十六进制字符串和给定范围的位中提取值(作为整数或字节)。例如:
hexString = "0x34840A00"
位(来自计算):00110100 10000100 00001 010 00000000
现在我需要从 8 到 10 的位:010
现在转换为整数/字节值。有什么帮助吗?我正在努力理解这里的位操作。

最佳答案

您可以先使用 Convert.FromHexString(hexString)从十六进制字符串中获取字节。然后你可以使用不安全的指针或 BitConverter.ToInt32()将所述字节转换为 32 位整数,然后您可以应用位移和其他位操作来提取您需要的位。例如:

string hexString = "0x34840A00";
byte[] bytes = Convert.FromHexString(hexString);
int myInt = BitConverter.ToInt32(bytes, 0);
// myInt looks like this 00110100 10000100 00001010 00000000
// now shift by 8 bits to the right
myInt >>= 8;
// now it looks like this 00000000 00110100 10000100 00001010
// to get the value of the last 3 bits we need to set the first 29 bits to 0
// so we AND them together with 29 0's followed by 3 1's:
myInt &= 0x00000007;
// which results in the following bits:
// 00000000 00000000 00000000 00000010
// leaving you with an integer of the value 010 in binary or 2 in decimal
位移位和 AND 运算始终遵循相同的规则:
  • 如果您想要从索引 n 开始的位(从最右边/最低有效位开始计算)然后右移 n位(在您的示例中 n=8(您不关心最右边的 8 位))。
  • m是您希望从位置 n 开始的位数(在您的示例中,您希望保留 3 位 010 )。 AND 结果连同整数 2^m - 1 .在您的示例中 m=3这将是 2^3-1 = 8-1 = 7 .因此我们做 myInt &= 0x00000007;或简而言之 myInt &= 0x7; .

  • 编辑:对于较旧的 .NET 版本和简化
    string hexString = "0x34840A00";
    int myInt = Convert.ToInt32(hexString, 16);
    // myInt looks like this 00110100 10000100 00001010 00000000
    // now shift by 8 bits to the right
    myInt >>= 8;
    // now it looks like this 00000000 00110100 10000100 00001010
    // to get the value of the last 3 bits we need to set the first 29 bits to 0
    // so we AND them together with 29 0's followed by 3 1's:
    myInt &= 0x00000007;
    // which results in the following bits:
    // 00000000 00000000 00000000 00000010
    // leaving you with an integer of the value 010 in binary or 2 in decimal
    因此,可重用(并且非常快)的方法将是这样的方法:
    private static int GetBitsFromHexString(string hexString, int startIndexFromRight, int bitsToKeep)
    {
    int result = Convert.ToInt32(hexString, 16);
    // shift by startIndexFromRight bits to the right
    result >>= startIndexFromRight;
    // AND the bits together with 32 - bitsToKeep 0's followed by bitsToKeep 1's:
    int bitmask = (1 << bitsToKeep) - 1; // is the same as 2^bitsToKeep - 1.
    // apply bitmask
    result &= bitmask;
    return result;
    }
    在你的例子中你会这样称呼它:
    int result = GetBitsFromHexString("0x34840A00", 8, 3);
    // result is 2 or 010 in binary

    关于c# - 如何从十六进制字符串中获取位范围并将其转换为整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68726311/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com