【问题标题】:C# Split HexStringC# 拆分十六进制字符串
【发布时间】:2012-06-13 10:31:33
【问题描述】:

好吧,我得到了我的 HexString (PacketS),例如“70340A0100000000000000”,我想在每次 2 个字符后拆分并将其放入一个字节数组(流)中。

表示 {70, 34, 0A, 01, 00, 00, 00, 00, 00, 00, 00}

【问题讨论】:

  • 在 Stack Overflow 上搜索“parse hex c# byte array”发现了几个命中,比如this one
  • 我得到了 string.length/2 来获取数组中的字节数。但我的问题是如何将其放入数组中。我发现了一些例子,例如在空格“”之后有一个滑动,但是没有那种分裂。
  • @Jon 首先谢谢你,但是如果没有“0x”开头,我该怎么做呢?我对 c# 不是很熟悉。
  • @Noli:您阅读答案的透彻程度如何,您花了多少时间试图理解代码?
  • 我只是不明白“ParseNybble”的作用以及一些基本的 sytex 理解,例如“int offset = hex.StartsWith("0x") ? 2 : 0;"

标签: c# arrays split hex byte


【解决方案1】:

最短路径(.NET 4+)是(取决于长度或原点):

byte[] myBytes = BigInteger.Parse("70340A0100000000000000", NumberStyles.HexNumber).ToByteArray();
Array.Reverse(myBytes);
myStram.write(myBytes, 0, myBytes.Length);

对于以前的版本,string.length/2 还定义了一个字节数组的长度,该长度可以为每个解析的对填充。这个字节数组可以像上面那样写在流上。

对于这两种情况,如果您的原始字符串太长,并且您希望避免使用巨大的字节数组,请继续执行从您的原始字符串获取 N 个字符组的步骤。

【讨论】:

  • 抱歉,耽搁了一点时间。我的代码现在是 PacketS = "70340A0100000000000000" byte[] outStream = BigInteger.Parse(PacketS,NumberStyles.HexNumber).ToByteArray(); serverStream.Write(outStream, 0, outStream.Length); outStream 现在是 - outStream {byte[11]} byte[] [0] 0 byte [1] 0 byte [2] 0 byte [3] 0 byte [4] 0 byte [5] 0 byte [6] 0 byte [ 7] 1 字节 [8] 10 字节 [9] 52 字节 [10] 112 字节代替 70, 34, 0A, 01, 00, 00, 00, 00, 00, 00, 00
  • 先反转字节数组,然后写入流: byte[] myBytes = BigInteger.Parse("70340A0100000000000000", NumberStyles.HexNumber).ToByteArray(); Array.Reverse(myBytes); myStram.write(myBytes, 0, myBytes.Length);
  • BigIntenger 不工作,它显示了正确的值,但数组顺序发生了变化。
【解决方案2】:

这实际上非常完美!很抱歉,如果您的代码执行相同的操作,但我就是不明白。

public static byte[] ConvertHexStringToByteArray(string hexString)
        {
            if (hexString.Length % 2 != 0)
            {
                throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "The binary key cannot have an odd number of digits: {0}", hexString));
            }

            byte[] HexAsBytes = new byte[hexString.Length / 2];
            for (int index = 0; index < HexAsBytes.Length; index++)
            {
                string byteValue = hexString.Substring(index * 2, 2);
                HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
            }

            return HexAsBytes;

【讨论】:

    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 2018-01-31
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 2019-02-21
    相关资源
    最近更新 更多