我有一个名为s_int的短整数变量,它包含value = 2
unsighed short s_int = 2;
我想将这个数字复制到char数组到char数组的第一个和第二个位置。
假设我们有char buffer[10];
。我们希望在s_int
和buffer[0]
复制buffer[1]
的两个字节。
我该怎么做?
答案 0 :(得分:13)
通常的方法是使用按位运算符对其进行切片和切块,一次一个字节:
b[0] = si & 0xff;
b[1] = (si >> 8) & 0xff;
虽然这应该在unsigned char
中完成,而不是普通char
,因为它们在大多数系统上都已签名。
存储较大的整数可以用类似的方式或循环来完成。
答案 1 :(得分:6)
*((short*)buffer) = s_int;
但是 viator emptor 结果字节顺序会随字节顺序而变化。
答案 2 :(得分: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];
答案 3 :(得分:2)
我会记住它,比如
memcpy(buffer, &s_int, 2);
正确保留了字节序,因此如果将缓冲区转换为unsigned short *,则可以正确的方式读取s_int的相同值。其他解决方案必须是endian-aware,否则你可以交换lsb和msb。当然sizeof(短)必须是2。
答案 4 :(得分:0)
如果你不想做所有那些按位的东西,你可以做以下
char* where = (char*)malloc(10);
short int a = 25232;
where[0] = *((char*)(&a) + 0);
where[1] = *((char*)(&a) + 1);