在C语言中将字节数组转换为int数组
下面我有一些代码,应该是将(Arduino)8位字节数组转换为16位整数数组,但它似乎只部分起作用。我不确定我做错了什么 字节数组以小端字节顺序排列。如何将其转换为int(每个enty两个字节)数组 用外行的话说,我想每两个字节合并一次 当前,它正在为输入字节数组输出:在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} 以下代码是我目前拥有的代码: 我写这个函数是基于 我还有一个基于相同代码的解决方案,它适
{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;i currentInt=(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*呢?你说的“部分”是什么意思工作?什么工作,什么不工作?@icepackint
可能是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;