在C#中转换int-> hex->二进制时出错“十六进制字符串有一个奇数位”

时间:2012-06-13 13:13:33

标签: c# integer hex bytearray

目标:

首先将整数值转换为hexstring,然后转换为byte []。

示例:

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

方法:

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

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

我的hexstring值为“400”。然后我尝试使用下面的代码

将十六进制字符串转换为byte []
    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;

    }

错误:

这里我得到了异常“Hex String不能有奇数位数”

解决方案 :??

4 个答案:

答案 0 :(得分:4)

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

string hexString = i.ToString("X08");

答案 1 :(得分: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();
    }

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

答案 2 :(得分:2)

您自己的代码抛出异常。您可以使代码更灵活,以接受具有奇数位数的十六进制字符串:

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

现在你可以删除奇/偶检查,你的代码也没问题。

答案 3 :(得分:1)

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

其他选项包括:

  1. 在字符串的开头添加“0”以使其长度为
  2. 强制任何调用该代码的人始终提供偶数长度的字符串
  3. 更改后面的代码以正确处理奇数个字符...
  4. 在评论中,您建议第一个是您需要知道的情况:

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

    将它放在方法的开头,如果你得到一个奇数,那么你将自动添加零。你当然可以拿出你的后期检查和例外投掷。

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

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