其他没有解释为什么您代码没有工作,所以我要在这一个快速刺:
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