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++; } |
对于
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 (); } } } } } |