2

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

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

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

4

1 回答 1

3

您可以根据解码的字节自己构建数字。也就是说,而不是BitConverter.ToInt16or 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
于 2013-05-14T14:47:48.180 回答