char *buffer;
short num;
memcpy(&num, buffer, sizeof(short));
*buffer
- 指向缓冲区的指针,其中number位于HEX视图中。
我想在不调用num
的情况下将此数字放在变量memcpy
中。
我该怎么做?
number = (short) buffer; //DOESN'T work!
答案 0 :(得分:4)
到目前为止,所有答案建议使用*(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);
答案 1 :(得分:2)
基于你的sizeof(short)
字节的memcpy,我猜你想从缓冲区指向的地方获取第一个sizeof(short)
字节。
number = * (short *) buffer;
正如其他人所指出的,会为你做到这一点。
您无法获取指针的地址并将其放入短片中,因此您需要取消引用它以获取内存中的值。
答案 2 :(得分:2)
两个字节短:
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关于这种关于字节序的假设的评论。
答案 3 :(得分:0)
假设“位于HEX视图中”表示数字存储在字符串中,如“89AB”,则可以使用strtol
函数。
char* end;
num = (short)strtol(buffer, &end, 16);
此函数将字符串转换为长整数。没有直接转换为短片的相应功能,所以无论如何你都必须做(short)
,但这不是问题,是吗?