C#中的Integer.parseInt(String s,int radix)

时间:2014-02-25 19:48:33

标签: c#

我在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#中的指令是什么?

感谢。

3 个答案:

答案 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);