当前位置:  开发笔记 > 编程语言 > 正文

将十六进制字符串转换为字节数组(.NET)的最佳方法是什么?

如何解决《将十六进制字符串转换为字节数组(.NET)的最佳方法是什么?》经验,为你挑选了1个好方法。

我有一个十六进制字符串,我需要转换为字节数组.最好的方法(即有效和最少的代码)是:

string hexstr = "683A2134";
byte[] bytes = new byte[hexstr.Length/2];
for(int x = 0; x < bytes.Length; x++)
{
    bytes[x] = Convert.ToByte(hexstr.Substring(x * 2, 2), 16);
}

在我有32位值的情况下,我可以执行以下操作:

string hexstr = "683A2134";
byte[] bytes = BitConverter.GetBytes(Convert.ToInt32(hexstr, 16)); 

然而,在一般情况下呢?有没有更好的内置功能,或更清晰(不必更快,但仍然高性能)这样做的方式?

我更喜欢内置函数,因为除了这个特殊的转换之外,似乎有一个用于所有东西(很常见的东西).



1> Guffa..:

如果从字符代码计算值而不是创建子字符串并解析它们,则可以获得最佳性能.

C#中的代码,处理大写和小写十六进制(但没有验证):

static byte[] ParseHexString(string hex) {
    byte[] bytes = new byte[hex.Length / 2];
    int shift = 4;
    int offset = 0;
    foreach (char c in hex) {
        int b = (c - '0') % 32;
        if (b > 9) b -= 7;
        bytes[offset] |= (byte)(b << shift);
        shift ^= 4;
        if (shift != 0) offset++;
    }
    return bytes;
}

用法:

byte[] bytes = ParseHexString("1fAB44AbcDEf00");

由于代码使用了一些技巧,这里有一个注释版本:

static byte[] ParseHexString(string hex) {
    // array to put the result in
    byte[] bytes = new byte[hex.Length / 2];
    // variable to determine shift of high/low nibble
    int shift = 4;
    // offset of the current byte in the array
    int offset = 0;
    // loop the characters in the string
    foreach (char c in hex) {
        // get character code in range 0-9, 17-22
        // the % 32 handles lower case characters
        int b = (c - '0') % 32;
        // correction for a-f
        if (b > 9) b -= 7;
        // store nibble (4 bits) in byte array
        bytes[offset] |= (byte)(b << shift);
        // toggle the shift variable between 0 and 4
        shift ^= 4;
        // move to next byte
        if (shift != 0) offset++;
    }
    return bytes;
}

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有