关于c#:十六进制字符串到字节数组?


String of hex into a byte array?

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
string hash ="4A|DA|6C|A9|C2|D5|71|EF|6E|2A|8C|C3|C9|4D|36|B9"
splitRHash2 = splitRHash.Split('|');
foreach (string i in splitRHash2)
{
    //BYTEARRAY += Convert.ToByte(Convert.ToInt32(i, 16))???
}

我不知道该怎么办。我只想要这串十六进制:

1
4ADA6CA9C2D571EF6E2A8CC3C94D36B9

到一个16字节的字节数组中。这将极大地帮助我从"hash"中调用这些值,并在以后为项目添加圆键。问题是,我不知道如何在不使用.split方法的情况下以2的增量获取字符串。有什么想法吗?谢谢!!


只需使用LINQ将拆分后的字符串转换为字节,然后再转换为数组。代码如下:

1
2
3
string hash ="4A|DA|6C|A9|C2|D5|71|EF|6E|2A|8C|C3|C9|4D|36|B9";
string[] splittedHash = hash.Split('|');
byte[] byteHash = splittedHash.Select(b => Convert.ToByte(b, 16)).ToArray();


您可以使用这样的基本数据结构和O(N)时间来制定解决方案。

1
2
3
4
5
6
7
8
9
10
11
12
string hash ="4A|DA|6C|A9|C2|D5|71|EF|6E|2A|8C|C3|C9|4D|36|B9";
byte[] result = new byte[16];

int i = 0;
int j = 0;
while(i < hash.Length)
{
    byte value = (byte)(HexCharToByte(hash[i]) * 16 + HexCharToByte(hash[i + 1]));
    result[j] = value;
    i += 3;
    j++;
}

对于HexCharToByte(),您可以这样弥补:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static byte HexCharToByte(char c)
{
    HashSet<char> NumSet = new HashSet<char>( new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'} );
    HashSet<char> CharSet = new HashSet<char>( new char[] { 'A', 'B', 'C', 'D', 'E', 'F' } );

    if (NumSet.Contains(c))
    {
        return (byte)(c - '0');
    }
    else if (CharSet.Contains(c))
    {
        return (byte)(c - 'A' + 10);
    }

    throw new InvalidArgumentException("c");
}


你在说这样的事吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApp
{
    class Program
    {
        static void Main (string[] args)
        {
            var str ="4ADA6CA9C2D571EF6E2A8CC3C94D36B9";

            var result = Partition (str, 2).ToArray ();
        }

        public static IEnumerable<string> Partition (string str, int partSize)
        {
            if (str == null) throw new ArgumentNullException ();
            if (partSize < 1) throw new ArgumentOutOfRangeException ();

            var sb = new StringBuilder (partSize);

            for (int i = 0; i < str.Length; i++)
            {
                sb.Append (str[i]);

                bool isLastChar = i == str.Length - 1;

                if (sb.Length == partSize || isLastChar)
                {
                    yield return sb.ToString ();
                    sb.Clear ();
                }
            }
        }
    }
}