使用mmap时整数存储为不正确的值

游泳大师

我正在编写一个程序,该程序将使用mmap将结构数组写入文件。问题是第三个整数值(左)未正确存储。通过查看文件时od,字节left似乎向左移了一个字节。例如...

|loc            |value  |left          |right          |extra bytes?
001 000 000 000 103 120 000 000 000 003 000 000 000 004 000 000 //expected
001 000 000 000 103 120 000 000 003 000 000 000 004 000 000 000 //result
typedef struct{
    int32_t loc;
    char value[2];
    int32_t left;
    int32_t right;

}Node;

Node newNode(int i);

int main(int argc, char *argv[])
{
    int i;
    int fd;
    int result;
    Node *map;  /* mmapped array of int's */

    int filesize = strtol(argv[2], NULL, 10) * sizeof(Node);
    int numvalues = filesize / sizeof(Node);

    fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
    if (fd == -1) {
        perror("File failed to open");
        exit(1);
    }

    //I dont know why this makes it work but we need to move the file pointer around for some reason.
    result = lseek(fd, filesize-1, SEEK_SET);
    if (result == -1) {
        close(fd);
        perror("Error calling lseek()");
        exit(2);
    }

    // same with this
    result = write(fd, "", 1);

    /* Now the file is ready to be mmapped.
    */
    map = (Node *) mmap(0, filesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (map == MAP_FAILED) {
        close(fd);
        perror("Error mmapping the file");
        exit(4);
    }


    for (i = 0; i <numvalues; ++i) {
        map[i] = newNode(i);         /* here is where I save the data */
    }

    munmap(map, filesize);
    close(fd);
    return 0;
}

Node newNode(int i) { /*This method is where the structs are made*/
    Node n;
    n.left = i * 2 + 1;
    n.right = i * 2 + 2;
    n.value[0] = (char)(rand() % ('A' - 'Z') )+ 'A';
    n.value[1] = (char)(rand() % ('A' - 'Z') )+ 'A';
    n.loc = i;

    printf("%d, %d, %c, %c, %d\n", n.left, n.right, n.value[0], n.value[1], n.loc);

    return n;
}

同样,为什么某些整数保存为little endian,而另一些保存为big endian。

丢失

您遇到了两个问题:持久性和结构填充。

Endianess

看来您的系统是小端的。这意味着最低有效字节将首先存储。我们可以在1存储为的事实中看到这一点01 00 00 00在大字节序系统中,它将是00 00 00 01这意味着您的“预期”结果不正确。应该如下。请注意,左字节和右字节已交换。

|loc            |value  |left          |right          |
001 000 000 000 103 120 003 000 000 000 004 000 000 000    

结构填充

那为什么不得到上述预期结果呢?因为编译器在结构中添加了用于单词对齐的填充。因此,在value字段之后有两个填充字节打印出来sizeof(Node)看看。因此,实际上所有内容都右移了两个字节。因此,实际的预期结果是:

|loc            |value  |pad     |left           |right          |
001 000 000 000 103 120  000 000 003 000 000 000 004 000 000 000    

这正是您显示的实际结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用联合存储的值显示不正确

来自分类Dev

使用堆栈视图时帧值不正确

来自分类Dev

使用Json.toJson时Float的不正确值

来自分类Dev

当datagridview中的整数单元中没有值时,使用vb.net的语法不正确?

来自分类Dev

Neo4j-使用Int64.MaxValue创建关系时存储的值不正确

来自分类Dev

使用bulletspan时换行不正确

来自分类Dev

使用bulletspan时换行不正确

来自分类Dev

使用sizeof()时输出不正确

来自分类Dev

如何只验证整数而不使用循环并在输入不正确时退出?

来自分类Dev

不正确的十进制(整数)值:''mySQL

来自分类Dev

使用unixtime值在时间戳上进行选择时,mysql日期时间值不正确

来自分类Dev

从 Store 检索值时返回不正确的值

来自分类Dev

asp net comparevalidator类型为double的datatypecheck允许使用不正确的值

来自分类Dev

asp net comparevalidator类型为double的datatypecheck允许使用不正确的值

来自分类Dev

使用实体框架4.3.1保存值时小数位数不正确

来自分类Dev

使用host.get(groupids)时Zabbix API返回不正确的值

来自分类Dev

尝试使用两个值以在 SSRS 中创建参数时语法不正确

来自分类Dev

解析XML文件时的值不正确

来自分类Dev

从数组中获取值时获取不正确的值

来自分类Dev

转换为货币时,Double值不正确

来自分类Dev

函数返回不正确的False(仅在较高值时)

来自分类Dev

当 filter_input 返回不正确的 cookie 值时

来自分类Dev

日期值不正确

来自分类Dev

求和值不正确

来自分类Dev

Python 不正确的值

来自分类Dev

使用html标记时,byte []值不正确

来自分类Dev

使用3D纹理时结果不正确

来自分类Dev

使用CoordinatorLayout时,我的ScrollView的尺寸不正确

来自分类Dev

使用UITableViewAutomaticDimension时UIImageView拉伸不正确

Related 相关文章

  1. 1

    使用联合存储的值显示不正确

  2. 2

    使用堆栈视图时帧值不正确

  3. 3

    使用Json.toJson时Float的不正确值

  4. 4

    当datagridview中的整数单元中没有值时,使用vb.net的语法不正确?

  5. 5

    Neo4j-使用Int64.MaxValue创建关系时存储的值不正确

  6. 6

    使用bulletspan时换行不正确

  7. 7

    使用bulletspan时换行不正确

  8. 8

    使用sizeof()时输出不正确

  9. 9

    如何只验证整数而不使用循环并在输入不正确时退出?

  10. 10

    不正确的十进制(整数)值:''mySQL

  11. 11

    使用unixtime值在时间戳上进行选择时,mysql日期时间值不正确

  12. 12

    从 Store 检索值时返回不正确的值

  13. 13

    asp net comparevalidator类型为double的datatypecheck允许使用不正确的值

  14. 14

    asp net comparevalidator类型为double的datatypecheck允许使用不正确的值

  15. 15

    使用实体框架4.3.1保存值时小数位数不正确

  16. 16

    使用host.get(groupids)时Zabbix API返回不正确的值

  17. 17

    尝试使用两个值以在 SSRS 中创建参数时语法不正确

  18. 18

    解析XML文件时的值不正确

  19. 19

    从数组中获取值时获取不正确的值

  20. 20

    转换为货币时,Double值不正确

  21. 21

    函数返回不正确的False(仅在较高值时)

  22. 22

    当 filter_input 返回不正确的 cookie 值时

  23. 23

    日期值不正确

  24. 24

    求和值不正确

  25. 25

    Python 不正确的值

  26. 26

    使用html标记时,byte []值不正确

  27. 27

    使用3D纹理时结果不正确

  28. 28

    使用CoordinatorLayout时,我的ScrollView的尺寸不正确

  29. 29

    使用UITableViewAutomaticDimension时UIImageView拉伸不正确

热门标签

归档