5

我有一个名为 s_int 的短整数变量,它保存 value = 2

unsighed short s_int = 2;

我想将此数字复制到 char 数组到 char 数组的第一个和第二个位置。

假设我们有char buffer[10];. 我们希望在和s_int处复制的两个字节。buffer[0]buffer[1]

我该怎么做?

4

5 回答 5

16

执行此操作的通常方法是使用按位运算符对其进行切片和切块,一次一个字节:

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

虽然这应该真正做到unsigned char,而不是平原char,因为它们在大多数系统上签名。

存储更大的整数可以用类似的方式或循环来完成。

于 2010-06-01T20:05:39.697 回答
7

*((short*)buffer) = s_int;

但是viator emptor认为生成的字节顺序会随字节顺序而变化。

于 2010-06-01T20:08:18.790 回答
3

通过使用指针和强制转换。

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];
于 2010-06-01T20:12:45.860 回答
3

我会记住它,比如

memcpy(缓冲区, &s_int, 2);

正确保留了字节序,因此如果您将缓冲区转换为 unsigned short *,您可以以正确的方式读取 s_int 的相同值。其他解决方案必须是字节序感知的,或者您可以交换 lsb 和 msb。当然 sizeof(short) 必须为 2。

于 2010-06-01T21:11:26.437 回答
0

如果您不想制作所有按位的东西,您可以执行以下操作

char* where = (char*)malloc(10);
short int a = 25232;
where[0] = *((char*)(&a) + 0);
where[1] = *((char*)(&a) + 1);
于 2010-06-01T20:07:57.690 回答