1
char *buffer; 
short num; 
memcpy(&num, buffer, sizeof(short)); 

*buffer- 指向缓冲区的指针,其中 number 位于 HEX 视图中。我想把这个数字放在变量中num而不调用memcpy. 我该怎么做?

number = (short) buffer; //DOESN'T work! 
4

4 回答 4

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);
于 2013-05-31T07:07:24.850 回答
2

根据您的sizeof(short)字节数,我猜您想sizeof(short)从缓冲区指向的位置获取第一个字节。

number = * (short *) buffer;

正如其他人指出的那样,将为您做到这一点。

您不能获取指针的地址并将其缩短,因此您需要取消引用它以获取内存中的值。

于 2013-05-31T06:50:55.910 回答
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 的评论,对此做出关于字节序的假设。

于 2013-05-31T06:51:45.503 回答
0

假设“位于 HEX 视图中”是指数字存储在“89AB”之类的字符串中,则可以使用该strtol函数。

char* end;
num = (short)strtol(buffer, &end, 16);

此函数将字符串转换为长整数。没有相应的函数可以直接转换为short,所以(short)无论如何你都必须做a,但这不是问题,是吗?

于 2013-05-31T06:55:07.163 回答