从C中的字节数组一次读取两个字节

时间:2017-12-27 13:40:56

标签: c arrays memory

我们说我有以下字节数组:

uint8_t barr[4] = {0xCE, 0xCE, 0xCE, 0xCE};

给定索引n,我希望能够读取两个字节:

uint16_t d16 = barr[0];

d16等于

0xCECE

也许标准库中有一个可以执行此类任务的功能?

2 个答案:

答案 0 :(得分:8)

小菜一碟:

memcpy(&d16, barr + n, sizeof(d16));

不要尝试转换指针或使用union。这些都是未定义的行为,或者可能会使陷阱表示失效。 memcpy()是“规范”解决方案(正如C ++ boost库所做的那样)。

答案 1 :(得分:0)

这里采用线性和字节顺序安全的方法:

#include <stdint.h>
#include <stdio.h>
#include <arpa/inet.h> /* for ntohs() */

union Convert
{
  uint16_t  to_integer_big_endian;
  uint8_t barr[sizeof (uint16_t)];
};

uint16_t pick_and_convert(uint8_t * barr, size_t s, size_t n)
{
  union Convert c = {0};  /* Take out-of-bound bytes as 0s. */

  for (size_t i = 0; i < sizeof c.barr && (n + i) < s; ++i)
  {
    c.barr[i] = barr[n + i];
  }

  return ntohs(c.to_integer_big_endian);
}

int main(void)
{
   uint8_t barr[4] = {1, 2, 3, 4}; /* Assuming a binary sequence. */
   size_t n;

   scanf("%zu", &n);

   uint16_t to_integer = pick_and_convert(barr, sizeof barr / sizeof *barr, n);

   printf("result = 0x%hx\n", to_integer);
 }