C# - 转换字节表示字符号到Int16

时间:2015-09-06 15:05:34

标签: c# .net parsing io

如果我有一个表示从文件读取的数字的字节数组,那么如何将字节数组转换为Int16 / short?

byte[] bytes = new byte[]{45,49,54,50 }  //Byte array representing "-162" from text file

short value = 0; //How to convert to -162 as a short here?

尝试使用BitConverter.ToInt16(字节,0),但值不正确。

编辑:寻找不使用字符串转换的解决方案。

2 个答案:

答案 0 :(得分:2)

此功能执行一些您可以排除的验证。如果您知道输入数组将始终包含至少一个元素并且该值将是有效的Int16,则可以简化它。

    const byte Negative = (byte)'-';
    const byte Zero = (byte)'0';
    static Int16 BytesToInt16(byte[] bytes)
    {
        if (null == bytes || bytes.Length == 0)
            return 0;
        int result = 0;
        bool isNegative = bytes[0] == Negative;
        int index = isNegative ? 1 : 0;
        for (; index < bytes.Length; index++)
        {
            result = 10 * result + (bytes[index] - Zero);
        }
        if (isNegative)
            result *= -1;
        if (result < Int16.MinValue)
            return Int16.MinValue;
        if (result > Int16.MaxValue)
            return Int16.MaxValue;
        return (Int16)result;
    }

答案 1 :(得分:0)

就像willaien所说,你想先把你的字节转换为字符串。

byte[] bytes = new byte[]{ 45,49,54,50 };
string numberString = Encoding.UTF8.GetString(bytes);
short value = Int16.Parse(numberString);

如果您不确定是否可以解析字符串,建议您使用Int16.TryParse

byte[] bytes = new byte[]{ 45,49,54,50 };
string numberString = Encoding.UTF8.GetString(bytes);
short value;

if (!Int16.TryParse(numberString, out value))
{
    // Parsing failed
}
else
{
    // Parsing worked, `value` now contains your value.
}