我在Java程序中有这个功能。
private static byte[] converToByte(String s)
{
byte[] output = new byte[s.length() / 2];
for (int i = 0, j = 0; i < s.length(); i += 2, j++)
{
output[j] = (byte)(Integer.parseInt(s.substring(i, i + 2), 16));
}
return output;
}
我正在尝试使用C#创建相同的东西,但我遇到了麻烦。我试过这个:
output[j] = (byte)(Int16.Parse(str.Substring(i, i + 2)));
但经过几次迭代后我得到了一个System.OverflowException,C#中的指令是什么?
感谢。
答案 0 :(得分:2)
您使用的是错误的数据类型:
output[j] = (byte)(Int16.Parse(str.Substring(i, i + 2)));
Short Name .NET Class Type Width Range (bits)
byte Byte Unsigned integer 8 0 to 255
short Int16 Signed integer 16 -32,768 to 32,767
你得到一个溢出异常,因为Int16(短)远远不适合一个字节。
答案 1 :(得分:2)
private static sbyte[] converToByte(string s)
{
sbyte[] output = new sbyte[s.Length / 2];
for (int i = 0, j = 0; i < s.Length; i += 2, j++)
{
output[j] = (sbyte)(Convert.ToInt32(s.Substring(i, 2), 16));
}
return output;
}
答案 2 :(得分:0)
在与自己的问题挣扎之后,我意识到真正的问题是Java的子串方法是:
substring(int beginIndex, int endIndex)
虽然C#的实现需要:
substring(int beginIndex, int length)
这意味着在C#中,相同的代码占用了更大的字节块,导致溢出。
@Dave Doknjas在正确的轨道上,但您仍然可以转换为具有新的较小块大小的字节。
output[j] = Convert.ToByte(str.Substring(i, i + 2), 16);