将base64值转换为数字

本文关键字:数字 转换 base64 | 更新日期: 2023-09-27 18:13:23

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

数据作为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字节,我不知道如何处理这种情况。

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

将base64值转换为数字

您可以从解码的字节中自己构建数字。也就是说,不是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,直到我们到达第三个字节。然后:

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