2010-06-01 60 views
3

我有称为s_int短整型变量,其保持值= 2复制短整型到字符数组

unsighed short s_int = 2; 

欲这个号码复制到一个字符数组的炭的第一和第二位置阵列。

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

我该怎么办?

回答

10

通常的方式做,这将与位运算符来切割它,每次一个字节:

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

虽然这应该真正做到为unsigned char,不是普通char作为他们在大多数系统上签名。

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

+0

'&0xff'是什么原因? – Almir 2013-12-11 08:01:48

+0

它将隐式截断转化为明确的截断。换句话说,程序员的意图是清楚的。 (我认为有些编译器可能会抱怨它?) – crazyscot 2013-12-12 08:26:12

+0

哦,我明白了:) thanx – Almir 2013-12-12 11:22:10

0

如果你不想让所有的按位的东西,你可以做以下

char* where = (char*)malloc(10); 
short int a = 25232; 
where[0] = *((char*)(&a) + 0); 
where[1] = *((char*)(&a) + 1); 
6

*((short*)buffer) = s_int;

维阿托尔自负所产生的字节顺序将字节排列顺序有所不同。

+0

Bingo。简单明了。 – 2010-06-01 20:10:31

+1

又快又脏;) – James 2010-06-01 20:12:28

+0

gcc可能会告诉你,'使用转换表达式作为左值已被弃用。 – 2010-06-01 20:21:11

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]; 
2

我会memcpy的它,像

memcpy(buffer, &s_int, 2);

字节序是否正确保存,这样,如果你投缓冲到无符号短*,你可以阅读s_int的相同值的正确方法。其他解决方案必须是endian意识,或者你可以交换LSB和MSB。当然sizeof(short)必须是2.

+1

'memcpy()'是一个好方法,但请注意“保留字节序”并不总是正确的。 crazyscot的答案将答案放入具有* known * endianness的缓冲区中,这通常是真正需要的(例如,如果要将缓冲区保存到文件或通过网络发送)。你的答案将答案放入具有* host * endianness的缓冲区中,这有时也是需要的(但不太经常)。 – caf 2010-06-02 00:03:11

+0

是的,当然是:“endiannes被保留”我的意思是说,数据存储在缓冲区中的方式与保存在内存中的短路相同,只要用户不需要直接访问缓冲区中的短值将字节序改变成特定的东西。 – ShinTakezou 2010-06-02 12:21:00

+0

虽然请注意,只有缓冲区正确对齐以进行此类访问,才可以直接访问缓冲区中的短路;一般来说,如果你要直接访问它,你应该将它声明为一个''struct',它包含'short'成员而不是'char'数组。需要对齐的处理器上的 – caf 2010-06-03 04:03:45