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

发布于 2024-07-29 18:10:37 字数 190 浏览 6 评论 0原文

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

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

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

This will convert 1 hex character to its integer value, but needs to construct a (sub) string.

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

Does .NET have a built-in way to convert a single hex character to its byte (or int, doesn't matter) value that doesn't involve creating a new string?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

看透却不说透 2024-08-05 18:10:38

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

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

I am adding another answer just because no one mentioned this one. You can use the built-in Uri.FromHex method for converting a single character:

var b = (byte) System.Uri.FromHex('a'); // b = 10
川水往事 2024-08-05 18:10:38
Encoding.UTF8.GetBytes( serializedString.ToCharArray(), 0, 1)

更便宜的可能是:

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

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

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

Cheaper might be:

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

This will only add the interesting char to the char[] and not the entire string.

葬﹪忆之殇 2024-08-05 18:10:37
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');
}
int value = "0123456789ABCDEF".IndexOf(char.ToUpper(sourceString[index]));

Or even faster (subtraction vs. array search), but no checking for bad input:

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');
}
懒猫 2024-08-05 18:10:37

您就可以简单地使用吗

Convert.ToByte(stringValue, 16);

如果我错了,请纠正我,但是只要 stringValue 代表十六进制数字, ? 这不是基本参数的重点吗?

字符串是不可变的,我认为没有办法在不创建新字符串的情况下获取索引 0 处 char 的子字符串字节值

Correct me if im wrong but can you simply use

Convert.ToByte(stringValue, 16);

as long as the stringValue represents a hex number? Isnt that the point of the base paramter?

Strings are immutable, I dont think there is a way to get the substring byte value of the char at index 0 without creating a new string

遮了一弯 2024-08-05 18:10:37

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

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

If you know the hex value is only a byte then just convert to an Int32 and then cast

var b = (byte)(Convert.ToInt32(serializedString, 16));
旧话新听 2024-08-05 18:10:37

当然,您无需创建另一个字符串即可获取十六进制值。 我不确定它会给你带来什么,从性能角度来看,但既然你问了,这就是你所要求的。

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

Sure you can get the hex value without ever needing to create another string. I'm not sure what it'll really gain you, performance wise, but since you asked, here's what you've requested.

    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;
            }
        }
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文