C# “错误”;十六进制字符串的位数为奇数;转换int时->;十六进制->;C语言中的二进制#
目标: 先将整数值转换为hexstring,然后再转换为字节[] 示例: 方法: 对于从整数到十六进制字符串的转换,我尝试了下面的代码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
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;
现在,您可以删除奇数/偶数检查,代码就可以了。您的十六进制字符串的位数为奇数,您正在显式检查并抛出异常。您需要决定为什么要将这行代码放在那里,以及是否需要删除这行代码以支持其他逻辑 其他选择包括:
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。