将base64值转换为数字

时间:2013-05-14 14:21:39

标签: c# base64

我正在接收有关车速的数据。我无法控制输入格式,但我确实需要使用数据。

数据以Base64编码值的形式发送给我。显然,数据以小端格式开头。目前,我的代码是:

public int b64ToInt(string Input){

    byte[] Output = Convert.FromBase64String(Input);
    Array.Reverse(Output);
    if (Output.Length == 1)
    {
        return (int)Output[0];
    }
    else if (Output.Length == 2)
    {
        return (int)BitConverter.ToInt16(Output, 0);
    }
    else
    {
        return BitConverter.ToInt32(Output, 0);
    }
}

这适用于我收到的大多数价值观,但不是全部。顺便说一句,要将此值转换为MPH,我需要除以1150.78。

以下值有效:AAB6Qg ==转换为27.19720537374 MPH。

以下值不起作用: AA09 显然,输出数组的长度为3个字节,我不知道如何处理这种情况。

我得到的错误消息是:“目标数组不够长,无法复制集合中的所有项目。检查数组索引和长度。”

1 个答案:

答案 0 :(得分:2)

您可以从解码的字节中自行构建数字。也就是说,而不是BitConverter.ToInt16BitConverter.ToInt32,请执行以下操作。 (注意,我没有反转数组。)

byte[] output = Convert.FromBase64String(input);
Console.WriteLine(output.Length);
int rslt = 0;
for (int i = 0; i < output.Length; ++i)
{
    rslt <<= 8;
    rslt += output[i];
}
Console.WriteLine(rslt);
Console.WriteLine((double)rslt / 1150.78);

给定输入字符串“AAB6Qg ==”,产生27.1972053737465。 “AA09”产生2.94495907123864。

我在这里做的只是将这四个字节拟合成一个32位整数。 <<= 8表示“向左移8位”。结果是每次通过循环时字节向左移动一个位置。

因此,给定数组{ 00, 00, 7A, 42 }rslt从0开始。结果保持为0直到我们到达第3个字节。然后:

rslt += output[2];  // rslt = 0x0000007A
// next time through the loop
rslt <<= 8          // rslt = 0x00007A00
rslt += output[3];  // rslt = 0x00007A42