我正在接收有关车速的数据。我无法控制输入格式,但我确实需要使用数据。
数据以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个字节,我不知道如何处理这种情况。
我得到的错误消息是:“目标数组不够长,无法复制集合中的所有项目。检查数组索引和长度。”
答案 0 :(得分:2)
您可以从解码的字节中自行构建数字。也就是说,而不是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直到我们到达第3个字节。然后:
rslt += output[2]; // rslt = 0x0000007A
// next time through the loop
rslt <<= 8 // rslt = 0x00007A00
rslt += output[3]; // rslt = 0x00007A42