我有一个短整型变量叫做s_int,它的值为2。
unsighed short s_int = 2;
我想将这个数字复制到一个字符数组的第一和第二个位置。
假设我们有一个char buffer[10];
。我们要将s_int
的两个字节复制到buffer[0]
和buffer[1]
。
我该怎么做?
我有一个短整型变量叫做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;
但请注意,最终的字节顺序会因大小端而异。
*
的结果作为左值,这是可以的(因为它确实是一个左值)。然而,它仍然存在对齐问题。 (“将强制类型转换用作左值”是像 (int)x = 10;
这样的表达式) - cafunsigned 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函数进行复制,代码如下:
memcpy(buffer, &s_int, 2);
这样可以正确地保留字节序,因此如果您将buffer强制转换为unsigned short *,您可以正确地读取s_int的相同值。其他解决方案必须具有端对端感知,或者您可以交换最低有效位和最高有效位。当然,sizeof(short)必须为2。
memcpy()
是一个不错的方法,但请注意,“保留字节序”并不总是正确的。crazyscot的答案将答案放入了具有已知字节序的缓冲区中,这通常是真正需要的(例如,如果要将缓冲区保存到文件或通过网络发送)。您的答案将答案放入具有主机字节序的缓冲区中,这也是有时需要的(但不太常见)。 - caf如果你不想做那些位运算的事情,你可以这样做
char* where = (char*)malloc(10);
short int a = 25232;
where[0] = *((char*)(&a) + 0);
where[1] = *((char*)(&a) + 1);
& 0xff
的原因是什么? - Almirb[0]
和b[1]
重构int类型的数据? - Casey