其他沒有解釋爲什麼您代碼沒有工作,所以我要在這一個快速刺:
memcpy(pshort , pchar + 1 , 1);
memcpy(pshort + 1, pchar , 1);
添加到TYPE * p
由sizeof(TYPE)
增量移動指針的指針(所以它確實指向下一個元素,請記住這只是定義的如果裏面的一個數組)。所以雖然pchar + 1
是正確的,pshort + 1
不是(因爲它正在處理下一個short
)。
aux = ((*pchar & 0x00FF) << 8) | ((*(pchar+1) & 0xFF00) >> 8);
錯誤......右手側被打破的方式不止一個。首先,*(pchar+1)
是char
,& 0xFF00
在char
將始終產生0(因爲一個char
是隻有8位開始,至少在當代機器...)。然後你將這8位移到右邊......?
而且,如果您不知道它,如果您沒有在左側使用0x00FF(將*pchar
提升到右側操作數的寬度),但是(char
大小)0xFF,該操作的結果仍然是char
類型,並且將8位向左移動也沒有多大意義(因爲該類型不會被神奇地擴展)。
另一種方式去了解這個尚未提及的是union
:
#include <stdio.h>
struct chars_t
{
// could also go for char[2] here,
// whichever makes more sense semantically...
char first;
char second;
};
union combo_t
{
// elements of a union share the memory, i.e.
// reside at the same address, not consecutive ones
short shrt;
struct chars_t chrs;
};
int main()
{
union combo_t x;
x.chrs.first = 0x01;
x.chrs.second = 0x02;
printf("%x", x.shrt);
return 0;
}
如果你在更大的範圍內使用此,謹防結構的填充。
您不能以這種方式使用memcpy,因爲ist無法自動轉換這些數據類型。您需要迭代src數組並將每個值都簡寫爲 – Westranger 2014-09-11 12:25:57
您需要知道該短文是否表示爲[little-endian或big-endian](http://en.wikipedia.org/wiki/Endianness)。 – interjay 2014-09-11 12:27:10
您需要知道pchar和pshort的字節順序。如果它們相同,則使用'memcpy((void *)pshort,(const void *)pchar,sizeof(short));' – 2014-09-11 12:38:35