2010-06-01 58 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