char *buffer;
short num;
memcpy(&num, buffer, sizeof(short));
*buffer
- 指向缓冲区的指针,其中 number 位于 HEX 视图中。我想把这个数字放在变量中num
而不调用memcpy
. 我该怎么做?
number = (short) buffer; //DOESN'T work!
到目前为止,所有答案都建议使用*(short *)buf
,但这没有任何好处-它违反了严格的别名规则( 的对齐方式short
大于 的char
,因此如果不调用未定义的行为就无法执行此操作)。
简短的回答是:你最好使用memcpy()
,但如果你真的不想要这样,那么你可以使用联合和“类型双关”(注意,这可能会导致字节缓冲区的陷阱表示可能或者可能不是你想要的):
union type_pun {
char buf[sizeof(short)];
short s;
};
union type_pun tp;
tp.buf[0] = 0xff;
tp.buf[1] = 0xaa; // whatever, if `short' is two bytes long
printf("%hd\n", tp.s);
根据您的sizeof(short)
字节数,我猜您想sizeof(short)
从缓冲区指向的位置获取第一个字节。
number = * (short *) buffer;
正如其他人指出的那样,将为您做到这一点。
您不能获取指针的地址并将其缩短,因此您需要取消引用它以获取内存中的值。
对于两个字节短:
number = (short)(
((unsigned char)buffer[0]) << 8 |
((unsigned char)buffer[1])
);
对于不同的短:
for (int i = 0; i < sizeof(short); i++)
number = (number << 8) + ((unsigned char) buffer[i]);
或者您将为每种尺寸提供一些宏。
另外,请参阅 tristopia 的评论,对此做出关于字节序的假设。
假设“位于 HEX 视图中”是指数字存储在“89AB”之类的字符串中,则可以使用该strtol
函数。
char* end;
num = (short)strtol(buffer, &end, 16);
此函数将字符串转换为长整数。没有相应的函数可以直接转换为short,所以(short)
无论如何你都必须做a,但这不是问题,是吗?