简而言之

时间:2013-05-31 06:49:10

标签: c casting

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

*buffer - 指向缓冲区的指针,其中number位于HEX视图中。 我想在不调用num的情况下将此数字放在变量memcpy中。 我该怎么做?

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

4 个答案:

答案 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),但这不是问题,是吗?