Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “错误”;十六进制字符串的位数为奇数;转换int时->;十六进制->;C语言中的二进制#_C#_Integer_Hex_Bytearray - Fatal编程技术网

C# “错误”;十六进制字符串的位数为奇数;转换int时->;十六进制->;C语言中的二进制#

C# “错误”;十六进制字符串的位数为奇数;转换int时->;十六进制->;C语言中的二进制#,c#,integer,hex,bytearray,C#,Integer,Hex,Bytearray,目标: 先将整数值转换为hexstring,然后再转换为字节[] 示例: 方法: 对于从整数到十六进制字符串的转换,我尝试了下面的代码 int i=1024; string hexString = i.ToString("X"); byte[] value = HexStringToByteArray(hexValue); /* function for converting hexstring to byte array */ public by

目标:

先将整数值转换为hexstring,然后再转换为字节[]

示例:

方法:

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

    int i=1024;
    string hexString = i.ToString("X");
    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;

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

    int i=1024;
    string hexString = i.ToString("X");
    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;

    }
byte[]value=HexStringToByteArray(hexValue);
/*用于将十六进制字符串转换为字节数组的函数*/
公共字节[]HexStringToByteArray(字符串十六进制)
{
int numbercars=十六进制长度;
如果(numbercars%2==1)
抛出新异常(“十六进制字符串不能有奇数位数。”);
字节[]字节=新字节[numbercars/2];
对于(int i=0;i
错误:

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


解决方案:??

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

string hexString = i.ToString("X08");
if (hex.Length % 2 == 1) hex = "0"+hex;

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

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();
    }
使用System.Collections.Generic;
使用System.Linq;
// ...
公共字节[]HexStringToByteArray(字符串十六进制)
{
var result=新列表();
对于(int i=十六进制长度-1;i>=0;i-=2)
{
如果(i>0)
{
插入(0,转换为ToByte(十六进制子字符串(i-1,2),16));
}
其他的
{
结果.插入(0,转换为ToByte(十六进制子字符串(i,1),16));
}
}
返回bytes.ToArray();
}

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

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

string hexString = i.ToString("X08");
if (hex.Length % 2 == 1) hex = "0"+hex;

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

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

其他选择包括:

  • 在字符串的开头添加一个“0”,使其长度均匀
  • 强制调用该代码的人始终提供偶数长度的字符串
  • 更改后面的代码以正确处理奇数字符
  • 在您的评论中,您建议第一点是您需要知道的,在这种情况下:

    if(hex.Length%2==1)
        hex = "0"+hex;
    
    把这个放在你的方法的开头,如果你得到一个奇数,那么你会自动加上零。当然,您可以执行稍后的检查并抛出异常

    需要注意的是,您可能希望将输入字符串验证为十六进制,或者可能只是在转换过程中添加一个try-catch,以确保它是一个有效的十六进制字符串


    此外,由于不清楚字符串是必要的中间步骤还是您认为必要的中间步骤,您可能会感兴趣的是,在不使用中间字符串的情况下,哪些步骤可以转换为字节。

    您的十六进制字符串的位数为奇数,您正在显式检查并引发异常。。。如果字符串的位数为奇数,您可以在字符串的开头添加一个零,或者更改后面的代码以处理奇数。。。你到底在哪里需要帮助?我有意添加了异常,因为我不需要奇数的十六进制字符串。这与代码中的逻辑背道而驰。那么,我如何确保ToString(“x”)总是给出长度相等的字符串呢???@DILi-见我的答案。这确保无论int值是多少,您都能得到8个十六进制数字。如果您在我的其余答案中看不到它,那么您可能会感兴趣-在不经过字符串阶段的情况下转换为bytearray。在我的情况下,完美且准确。。“string hexstring=i.ToString(“x04”);”就足够了。事实上,我应该感谢你给了我这么简单而冷静的回答。你值得所有的支持票。向你致敬@SwDevMan81i我看到了。。如果(十六进制长度%2==1)十六进制=“0”+hex。这将满足我的需要。在我的例子中,需要转换为hextstring。