在C#中将单个十六进制字符转换为其字节值

时间:2009-07-31 21:27:21

标签: c# .net hex

这会将1个十六进制字符转换为整数值,但需要构造一个(子)字符串。

Convert.ToInt32(serializedString.Substring(0,1), 16);

.NET是否有内置方法将单个十六进制字符转换为不涉及创建新字符串的字节(或int,无关紧要)值?

6 个答案:

答案 0 :(得分:16)

int value = "0123456789ABCDEF".IndexOf(char.ToUpper(sourceString[index]));

甚至更快(减法与阵列搜索),但不检查输入错误:

int HexToInt(char hexChar)
{
    hexChar = char.ToUpper(hexChar);  // may not be necessary

    return (int)hexChar < (int)'A' ?
        ((int)hexChar - (int)'0') :
        10 + ((int)hexChar - (int)'A');
}

答案 1 :(得分:16)

如果我错了,请纠正我,但你可以简单地使用

Convert.ToByte(stringValue, 16);

只要stringValue代表十六进制数字?这不是基本参数的重点吗?

字符串是不可变的,我不认为有一种方法可以在索引0处获取char的子字符串字节值而无需创建新字符串

答案 2 :(得分:2)

当然,您无需创建其他字符串即可获取十六进制值。我不确定它会给你带来什么,表现明智,但既然你问过,这就是你要求的。

    public int FromHex(ref string hexcode, int index)
    {
            char c = hexcode[index];
            switch (c)
            {
                case '1':
                    return 1;
                case '2':
                    return 2;
                case '3':
                    return 3;
                case '4':
                    return 4;
                case '5':
                    return 5;
                case '6':
                    return 6;
                case '7':
                    return 7;
                case '8':
                    return 8;
                case '9':
                    return 9;
                case 'A':
                case 'a':
                    return 0xa;
                case 'B':
                case 'b':
                    return 0xb;
                case 'C':
                case 'c':
                    return 0xc;
                case 'D':
                case 'd':
                    return 0xd;
                case 'E':
                case 'e':
                    return 0xe;
                case 'F':
                case 'f':
                    return 0xf;
                case '0':
                default:
                    return 0;
            }
        }
    }

答案 3 :(得分:1)

如果您知道十六进制值只是一个字节,那么只需转换为Int32然后再转换

var b = (byte)(Convert.ToInt32(serializedString, 16));

答案 4 :(得分:0)

我添加另一个答案只是因为没有人提到这个答案。您可以使用内置的Uri.FromHex方法来转换单个字符:

var b = (byte) System.Uri.FromHex('a'); // b = 10

答案 5 :(得分:-1)

Encoding.UTF8.GetBytes( serializedString.ToCharArray(), 0, 1)

便宜可能是:

Encoding.UTF8.GetBytes( new char[]{ serializedString[0] }, 0, 1)

这只会将有趣的char添加到char []而不是整个字符串。