3

我有的是这个

char receivedData[27];
short int twoBytes;

我想要的是twoBytes保持的值receivedData[14]receivedData[15] 含义,如果receivedData[14]==0x07receivedData[15]==0xBB,结果将是twoBytes=0x07BB

4

4 回答 4

5

twoBytes = receivedData[14] << 8 | receivedData[15];

<< 8表示左移 8 位(二进制;或 2 位十六进制),本质上是将值乘以 64。这意味着0x0007变为0x0700.

|然后将其or与另一个值一起使用,本质上将其设置为0x07bb.

于 2013-01-29T20:38:13.787 回答
3

重要的部分是将 receivedData[14] 左移 8 位。然后你可以| 或 + 该值到 receivedData[15]。重要的是要指出您指定的类型可能会导致问题。使用 char 数组意味着每个元素至少为 8 位,如果不指定无符号,这可能意味着为符号保留 1 位。更大的问题是 char 不能保证是 8 位,它可能会更大。short int 也是如此,该值至少为 16 位,但可能更大。你也想使用一个无符号短整数最好使用stdint.h,这样你就可以准确地知道你的变量大小:

#include <stdio.h>
#include <stdint.h>

main() {
  uint8_t receivedData[27];
  uint16_t twoBytes;
  receivedData[14] = 0x07;
  receivedData[15] = 0xBB;

  twoBytes = receivedData[14] << 8;
  twoBytes = twoBytes |  receivedData[15];

  printf("twoBytes %X\n", twoBytes);
}

您可以通过以下方式检查特定类型的大小:

printf("%zu\n", sizeof(char));

希望有帮助。

于 2013-01-29T21:47:41.507 回答
2
Just use logical operators
twoBytes=receivedData[14]; //twobytes=07h
twoBytes=twoBytes<<8; //twobytes=0700h
twoBytes|=receivedData[15]; //twobytes=07BBh
于 2013-01-29T20:39:29.990 回答
1

我不确定您的应用程序,但receivedData闻起来像来自另一台计算机的数据,这可能是以下用例ntohx

#include <iostream>
#include <cstdint>
#include <iomanip>
#include <arpa/inet.h>

int main() {

  uint8_t receivedData[27] {
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xBB,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00 };

  {
    // The ugly way.
    // You have to be sure that the alignment works.
    uint16_t const twoBytes { 
      ntohs( *reinterpret_cast<uint16_t*>( &receivedData[14] ) ) };
    std::cout << "TB [" << std::hex << twoBytes << "]" << std::endl;
  }

  {
    // The union way
    union {
      uint8_t  rd[2];
      uint16_t s;
    };

    rd[0] = receivedData[14]; rd[1] = receivedData[15];
    uint16_t const twoBytes { ntohs( s ) };
    std::cout << "TB [" << std::hex << twoBytes << "]" << std::endl;
  }

  return 0;
}

输出:

TB [7bb]
TB [7bb]
于 2013-01-29T21:02:06.707 回答