在C语言中将字节数组转换为int数组

在C语言中将字节数组转换为int数组,c,arrays,type-conversion,arduino,C,Arrays,Type Conversion,Arduino,下面我有一些代码,应该是将(Arduino)8位字节数组转换为16位整数数组,但它似乎只部分起作用。我不确定我做错了什么 字节数组以小端字节顺序排列。如何将其转换为int(每个enty两个字节)数组 用外行的话说,我想每两个字节合并一次 当前,它正在为输入字节数组输出:{0x10,0x00,0x00,0x00,0x30,0x00}。输出的INT数组是:{1,0,0}。输出应该是一个INT数组:{1,0,3} 以下代码是我目前拥有的代码: 我写这个函数是基于 我还有一个基于相同代码的解决方案,它适

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

字节数组以小端字节顺序排列。如何将其转换为int(每个enty两个字节)数组

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

当前,它正在为输入字节数组输出:
{0x10,0x00,0x00,0x00,0x30,0x00}
。输出的INT数组是:
{1,0,0}
。输出应该是一个INT数组:
{1,0,3}

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


我写这个函数是基于


我还有一个基于相同代码的解决方案,它适用于字节数组到长(32位)数组
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;
    }
/**
*将检索到的字节转换为一组16位整数
**/
int*byteA2IntA(字节*byte_切片,int-sizeOfB,int*ret_数组){
//存储要存储在SRAM中的寻址整数的变量
int当前int;
int sizeOfI=sizeOfB/2;
如果(sizeOfB%2!=0)++sizeOfI;
对于(int i=0;icurrentInt=(currentInt问题很可能是您增加了ret_数组,然后返回它。当您返回它时,它将指向目标数组之外的一个位置


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

这行代码是什么意思

if(i + 1 < sizeOfB) currentInt = (currentInt << 8) + byte_slice[i+1];
如果(i+1
将两个字节合并为一个16位整数,一个字节为MSB,一个字节为LSB


int16 result=(byteMSB考虑使用一个结构。不过这是一种黑客行为

在我的头顶上看起来是这样的

struct customINT16 {
    byte ByteHigh;
    byte ByteLow;
}
所以在你的情况下,你会写:

struct customINT16 myINT16;

myINT16.ByteHigh = BYTEARRAY[0];
myINT16.ByteLow = BYTEARRAY[1];
但是,您必须通过一个指针来强制转换它:

intpointer = (int*)(&myINT16);
INTARRAY[0] = *intpointer;

为什么不将指向输入数组的指针强制转换为int*呢?你说的“部分”是什么意思工作?什么工作,什么不工作?@icepack
int
可能是4个字节,他正在将2个字节转换成一个int。@AkiSuihkonen可能工作,如果short是2个字节,endianness允许。@alk aa,我明白你的意思。在这种情况下,使用int可能不是最好的选择,16位类型更适合(类似于AkiSuihkonen的建议)我基于这个解决方案编写了这个函数:我也基于同样的代码编写了这个解决方案,它适用于字节数组到长(32位)数组@frazras。也许你应该澄清你所说的“但它似乎只部分起作用”的意思:)!他说这是第一个……但你的按位or肯定优于加号
struct customINT16 myINT16;

myINT16.ByteHigh = BYTEARRAY[0];
myINT16.ByteLow = BYTEARRAY[1];
intpointer = (int*)(&myINT16);
INTARRAY[0] = *intpointer;