十六进制字符串成字节数组?

时间:2017-11-25 07:26:58

标签: c#

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))???
}

我不知道怎么回事。我只想要这个十六进制字符串:

4ADA6CA9C2D571EF6E2A8CC3C94D36B9

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

3 个答案:

答案 0 :(得分:1)

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

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();

答案 1 :(得分:0)

你在谈论这样的事情吗?

SELECT REPLACE(CONVERT(CHAR(10), date_field, 120),' ','-') + '-' + RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(HOUR, date_field)), 2) + ':00:00' as CalculatedTime,
COUNT(PingLogID) AS PingCount
FROM tbl_PingLog
GROUP BY REPLACE(CONVERT(CHAR(10), date_field, 120),' ','-') + '-' + RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(HOUR, date_field)), 2) + ':00:00'
ORDER BY REPLACE(CONVERT(CHAR(10), date_field, 120),' ','-') + '-' + RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(HOUR, date_field)), 2) + ':00:00'

答案 2 :(得分:0)

您可以使用基本数据结构和O(n)时间来制作解决方案。

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(),您可以构成以下内容:

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