将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字节,我不知道如何处理这种情况。
我得到的错误消息是:"目标数组不够长,无法复制集合中的所有项。"检查数组索引和长度。"
您可以从解码的字节中自己构建数字。也就是说,不是BitConverter.ToInt16
或BitConverter.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