3

我在下面有一些代码应该将C (Arduino) 8 位字节数组转换为 16 位 int 数组,但它似乎只能部分工作。我不确定我做错了什么。

字节数组采用小端字节序。如何将其转换为 int(每个实体两个字节)数组?

用外行的话来说,我想每两个字节合并一次。

目前它正在为输入 BYTE ARRAY 输出:{0x10, 0x00, 0x00, 0x00, 0x30, 0x00}。输出 INT ARRAY 是:{1,0,0}。输出应该是一个 INT ARRAY is: {1,0,3}

下面的代码是我目前拥有的:

我根据Stack Overflow 问题Convert bytes in a C array as longs 中的解决方案编写了这个函数。

我也有这个基于相同代码的解决方案,它适用于 byte array to long (32-bits) array http://pastebin.com/TQzyTU2j

/**
* Convert the retrieved bytes into a set of 16 bit ints
**/
int * byteA2IntA(byte * byte_slice, int sizeOfB, int * ret_array){

    //Variable that stores the addressed int to be stored in SRAM
    int currentInt;
    int sizeOfI = sizeOfB / 2;

    if(sizeOfB % 2 != 0) ++sizeOfI;
        for(int i = 0; i < sizeOfB; i+=2){
            currentInt = 0;
            if(byte_slice[i]=='\0') {
                break;
            }
            if(i + 1 < sizeOfB)
                currentInt = (currentInt << 8) + byte_slice[i+1];
            currentInt = (currentInt << 8) + byte_slice[i+0];
            *ret_array = currentInt;
            ret_array++;
        }
        //Pointer to the return array in the parent scope.
        return ret_array;
    }
4

4 回答 4

2

这行代码是什么意思?

if(i + 1 < sizeOfB) currentInt = (currentInt << 8) + byte_slice[i+1];

这里currentInt总是00 << 8 = 0

另外,您要做的是,对于每一对bytes(让我从现在开始称呼他们),您通过执行以下操作来uint8_t打包int(让我从现在开始称呼它):uint16_t

  1. 你拿最右边uint8_t
  2. 你将它向左移动 8 个位置
  3. 你添加最左边的uint8_t

这真的是你想要的吗?

假设你有byte_slice[] = {1, 2},你打包一个值为 513 ( 2<<8 + 1) 的 16 位整数!

此外,您不需要返回指向数组的指针,uint16_t因为调用者已经将它提供给函数。

如果你使用函数的返回,正如 Joachim 所说,你会得到一个从uint16_t数组的位置开始的指针,它不是 position [0]

于 2012-11-01T12:01:29.210 回答
2

文森佐有一点(或两点),您需要清楚自己要做什么;

将两个字节组合成一个 16 位 int,一个字节为 MSB,一个字节为 LSB

int16 result = (byteMSB << 8) | byteLSB;

将字节数组转换为 16 位

for(i = 0; i < num_of_bytes; i++)
{
    myint16array[i] = mybytearray[i];
}

将一组数据复制到另一个数组中

memcpy(dest, src, num_bytes);

这将(可能取决于平台/编译器)与我的第一个示例具有相同的效果。

此外,请注意使用整数,因为这表明有符号值,使用 uint,更安全,可能更快。

于 2012-11-01T13:28:14.683 回答
1

考虑使用结构。不过,这是一种黑客行为。

在我的脑海中,它看起来像这样。

struct customINT16 {
    byte ByteHigh;
    byte ByteLow;
}

所以在你的情况下,你会写:

struct customINT16 myINT16;

myINT16.ByteHigh = BYTEARRAY[0];
myINT16.ByteLow = BYTEARRAY[1];

但是,您必须通过一个指针来转换它:

intpointer = (int*)(&myINT16);
INTARRAY[0] = *intpointer;
于 2012-11-01T19:23:14.437 回答
1

问题很可能是您增加ret_array然后返回它。当你返回它时,它将指向目标数组之外的一个地方。

将指针保存在函数的开头,并改用该指针。

于 2012-11-01T11:38:45.990 回答