我有一个称为s_int的简短整数变量,该变量保持值= 2

unsighed short s_int = 2;

我想将此数字复制到字符阵列的第一个和第二位置。

假设我们有 char buffer[10];. 。我们想要两个字节 s_int 被复制 buffer[0]buffer[1].

我该怎么做?

有帮助吗?

解决方案

通常的方法是将其切成薄片和切成薄片,一次是一个字节:

b[0] = si & 0xff;
b[1] = (si >> 8) & 0xff;

虽然这确实应该做到 unsigned char, ,不是平淡的 char 由于它们在大多数系统上签名。

存储较大的整数可以以类似的方式或循环进行。

其他提示

*((short*)buffer) = s_int;

viator emptor 由此产生的字节顺序会随着底色而变化。

通过使用指针和演员。

unsigned short s_int = 2;
unsigned char buffer[sizeof(unsigned short)];

// 1.
unsigned char * p_int = (unsigned char *)&s_int;
buffer[0] = p_int[0];
buffer[1] = p_int[1];

// 2.
memcpy(buffer, (unsigned char *)&s_int, sizeof(unsigned short));

// 3.
std::copy((unsigned char *)&s_int,
          ((unsigned char *)&s_int) + sizeof(unsigned short),
          buffer);

// 4.
unsigned short * p_buffer = (unsigned short *)(buffer); // May have alignment issues
*p_buffer = s_int;

// 5.
union Not_To_Use
{
  unsigned short s_int;
  unsigned char  buffer[2];
};

union Not_To_Use converter;
converter.s_int = s_int;
buffer[0] = converter.buffer[0];
buffer[1] = converter.buffer[1];

我会记住它,就像

memcpy(buffer, &s_int, 2);

端度正确保留,以便如果将缓冲区施加到无符号短 * *,则可以以正确的方式读取相同的S_INT值。其他解决方案必须是endian了解的,否则您可以交换LSB和MSB。当然,大小(短)必须是2。

如果您不想制作所有这些钻头,可以做以下

char* where = (char*)malloc(10);
short int a = 25232;
where[0] = *((char*)(&a) + 0);
where[1] = *((char*)(&a) + 1);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top