1

我正在尝试将字节流分配给结构。流正确进入结构,因为我可以在调试窗口中看到它,但是当我尝试打印它时,结构没有正确显示 8 字节整数值。

输出:

serial no :: 1
Timestamp :: -1541974141
userid :: 0

代码:

#include <QCoreApplication>

#pragma pack(push,1)
struct info
{
    int serialno;
    long long timestamp;
    int userid;
};
#pragma (pop)

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    unsigned char arr[16];
    arr[0] = 0x01;
    arr[1] = 0x00;
    arr[2] =  0x00;
    arr[3] =  0x00;
    arr[4] = 0x83;
    arr[5] = 0x57;
    arr[6] = 0x17;
    arr[7] = 0xA4;
    arr[8] = 0xF6;
    arr[9] = 0x00;
    arr[10] = 0x00;
    arr[11] = 0x00;
    arr[12] = 0x00;
    arr[13] =  0x00;
    arr[14] =  0x00;
    arr[15] =  0x00;

    info *var;
    var = (info*)&arr[0];
    printf("serial no :: %d\n",var->serialno);
    printf("Timestamp :: %d\n",var->timestamp);
    printf("userid :: %d\n",var->userid);

    return a.exec();
}
4

2 回答 2

1

这就是为什么printf()和朋友气馁的原因。它们不是类型安全的。%d打印一个int. 您正在传递 a long long,因此内部将printf()其截断为int部分。

改为使用std::cout,它将使用适当大小的重载:

#include <iostream>

std::cout << "serial no :: " << var->serialno << '\n';
std::cout << "Timestamp :: " << var->timestamp << '\n';
std::cout << "userid :: " << var->userid << '\n';
于 2013-07-29T07:15:01.273 回答
0

Read endianess It is because of the architecture of the system you are seeing such behavior

In big-endian the integer value is stored in memory from lower to higher addresses . On a little-endian system it is vice-versa.

于 2013-07-29T07:12:20.723 回答