0

目标 :

首先将整数值转换为十六进制字符串,然后再转换为字节[]。

例子 :

   Need to convert  int:1024 to hexstring:400 to byte[]: 00000100 00000000

方法:

为了从整数转换为十六进制字符串,我尝试了下面的代码

    int i=1024;
    string hexString = i.ToString("X");

我得到的十六进制值是“400”。然后我尝试使用下面的代码将十六进制字符串转换为字节 []

    byte[] value = HexStringToByteArray(hexValue);

    /* function for converting hexstring to  byte array */
    public  byte[] HexStringToByteArray(string hex)
    {

        int NumberChars = hex.Length;

        if(NumberChars %2==1)
          throw new Exception("Hex string cannot have an odd number of digits.");

        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;

    }

错误:

在这里我得到了例外“十六进制字符串不能有奇数位数”

解决方案:??

4

4 回答 4

5

您可以强制ToString返回特定位数:

string hexString = i.ToString("X08");
于 2012-06-13T13:15:08.267 回答
3

异常是由您自己的代码引发的。您可以使您的代码更灵活地接受具有奇数位数的十六进制字符串:

if (hex.Length % 2 == 1) hex = "0"+hex;

现在您可以删除奇数/偶数检查,您的代码就可以了。

于 2012-06-13T13:18:34.757 回答
2

您的代码会引发您看到的异常:

throw new Exception("Hex string cannot have an odd number of digits.");

您可以改进转换方法以接受奇数的十六进制字符串长度,如下所示:

using System.Collections.Generic;
using System.Linq;

// ...

public  byte[] HexStringToByteArray(string hex)
    {
        var result = new List<byte>();

        for (int i = hex.Length - 1; i >= 0; i -= 2)
            {
                if (i > 0)
                    {
                        result.Insert(0, Convert.ToByte(hex.Substring(i - 1, 2), 16));
                    }
                else
                    {
                        result.Insert(0, Convert.ToByte(hex.Substring(i, 1), 16));
                    }
            }

        return bytes.ToArray();
    }

此代码应从其末尾迭代十六进制字符串,将新字节添加到结果列表的开头(在返回值之前将转换为数组)。如果剩下一个数字,将单独处理。

于 2012-06-13T13:17:21.403 回答
1

您的十六进制字符串有奇数位数,您正在明确检查并抛出异常。您需要决定为什么将这行代码放在那里,以及是否需要删除它以支持其他逻辑。

其他选项包括:

  1. 在字符串的开头添加“0”以使其长度均匀
  2. 强制调用该代码的人始终提供偶数长度的字符串
  3. 更改后面的代码以正确处理奇数个字符...

在评论中,您建议第一个是您在这种情况下需要知道的内容:

if(hex.Length%2==1)
    hex = "0"+hex;

把它放在你的方法的开头,如果你得到一个奇数,那么你会自动添加零。然后,您当然可以取出以后的检查和异常抛出。

值得注意的是,您可能希望将输入字符串验证为十六进制,或者可能只是在转换过程中使用 try catch 以确保它是有效的十六进制字符串。

此外,由于尚不清楚字符串是必要的中间步骤还是您认为必要的步骤,您可能对C# int to byte[]感兴趣,它处理在没有中间字符串的情况下转换为字节。

于 2012-06-13T13:19:53.590 回答