2012-11-01 100 views
3

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

字节数组以小尾数字节顺序排列。如何将它转换为int(每个两个字节)数组?

通俗地说,我想合并每两个字节。

目前它正在输出一个输入BYTE阵列:​​。输出INT阵列是:{1,0,0}。输出应该是INT ARRAY是:{1,0,3}

下面的代码是什么我目前有:

我写了基于a solution in Stack Overflow question Convert bytes in a C array as longs此功能。

我也有这个解决方案基于相同的代码,它适用于字节数组到长(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; 
    } 
+1

你为什么不只投int *指向输入数组的指针? – SomeWittyUsername

+0

你对“部分”工作有什么意义?什么可行,什么不行? –

+1

@icepack int可能是4个字节,他将2个字节转换为一个int。 –

回答

1

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

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

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},你打包一个16位整数值为513(2<<8 + 1)!

此外,您不需要将指针返回到uint16_t的数组,因为调用方已将其提供给该函数。

如果您使用函数的返回值,如Joachim所说,您会从uint16_t数组的位置开始获取指针,该位置不是位置[0]

+0

我写这个函数基于这个解决方案:http://stackoverflow.com/questions/11295728/convert-bytes-in-ac-array-as-longs/11295756#11295756 – frazras

+0

我也有这个解决方案基于相同的代码,适用于字节数组到长(32位)数组http://pastebin.com/TQzyTU2j – frazras

+0

@frazras也许你应该澄清你的意思是“但它似乎只是部分工作”: )! –

2

Vincenzo有一点(或两点),你需要清楚你想要做什么;

结合的两个字节的一个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); 

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

另外,要小心使用int,因为它暗示着符号值,使用提示,更安全,可能更快。

+0

他说这是第一个......但是,你的位或肯定比加号好 – texasbruce

+0

现在关闭眼镜... –

1

考虑使用结构。虽然这是一种黑客。

关闭我的头顶部看起来像这样。

struct customINT16 { 
    byte ByteHigh; 
    byte ByteLow; 
} 

所以你的情况,你可以这样写:

struct customINT16 myINT16; 

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

你必须要经过一个指针投它,但:

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