访问数组奇数索引时C中位移的错误

Rya*_*ler 1 c bit-shift bluetooth-lowenergy

我目前正在通过蓝牙(作为特征)向C程序发送一组无符号的8位整数.当收到这个数据包时,我想拿一对索引并"连接"它们的数字,如下所示:

Input: [0xDE, 0xAD, 
        0xDE, 0xAD, 
        0xBE, 0xEF]

Output: [0xDEAD, 0xDEAD, 0xBEEF]
Run Code Online (Sandbox Code Playgroud)

但是,我遇到了一个奇怪的问题.当我输出到一个偶数索引(取数组的前两个元素并将它们连接起来)时,我的代码工作正常,但是当我输出到奇数元素时失败(例如,尝试连接元素3和4(0xDE和0xAD) .

所以,我从程序中得到的输出是这样的:

Input: [0xDE, 0xAD, 
        0xDE, 0xAD, 
        0xBE, 0xEF]

Output: [0xDEAD, 0xADDE, 0xBEEF]
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

  for(int i = 0; i < numUUID; i++)
  {
      // The i+1 and i+2 are because the first value of the array contains
      // a byte on how many UUIDs are incoming
      uuidFilter[i] = (incoming[i + 1] << 8) | incoming[i + 2];
  }
Run Code Online (Sandbox Code Playgroud)

Max*_*Max 5

假设您的输入是这样的:

[numUUID, 0xDE, 0xAD, 0xDE, 0xAD, 0xBE, 0xEF]
Run Code Online (Sandbox Code Playgroud)

你的高字节在索引1,3和5,而低字节在索引2,4和6.请注意它们是两个.这意味着当你索引到数组时,你应该有一个2*i地方,这样你就可以在每个增量上逐步进行操作.这是答案:

for(int i = 0; i < numUUID; i++)
{
    uuidFilter[i] = (incoming[2*i + 1] << 8) | incoming[2*i + 2];
}
Run Code Online (Sandbox Code Playgroud)

这假设numUUID是您连接的数.如果它是字节数,那么当然你需要在循环条件中将它除以2.