首页 > 解决方案 > 在二进制文件中使用 2 字节字符数组写入不寻常的额外 2 字节

问题描述

我正在为一个旧赋值编写一个生成器,它按顺序生成一个二叉树并将其打印到一个二进制文件中,然后我可以在 bash 中使用 od 检查节点是否正确写入。我注意到,当写入携带节点值的 2 char 数组时,与预期的最多 2 个字节相比,它最终占用了 4 个字节。不仅如此,而且每次写入第三个节点时,额外的 2 个字节都是用 0xFFFF 填充的负数。当我从 Node 结构和所有相关代码中删除 char 数组时,无论那些额外的字节都完全消失了。通过在回读时忽略文件的那一部分,我能够很好地完成作业,但我仍然很难理解为什么它首先被写入。我将包含我的代码和“od -x”的输出


    int32_t loc;

    char value[2];

    int32_t left;

    int32_t right;

}Node;

char getRandUpper() {
    return (char)('A' + (rand() % 26));
}

int main(int argc, char* argv[]) {
    srand((unsigned int)time(NULL));

    int numOfNodes = atoi(argv[2]);
    char* fileName = argv[1];

    FILE* filePtr = fopen(fileName, "wb");

    Node biTree[numOfNodes];

    for(int i = 0; i < numOfNodes; i++) {
        biTree[i].loc = i;
        if((i * 2) >= numOfNodes) {
            biTree[i].left = -1;
            biTree[i].right = -1;
        } else {
            biTree[i].left = (2 * i) + 1;
            biTree[i].right = (2 * i) + 2;
        }
        for(int j = 0; j < 2; j ++) {
            biTree[i].value[j] = getRandUpper();
            printf("%c", biTree[i].value[j]);
            printf("size of char array: %ld bytes\n", sizeof(biTree[i].value));
        }
    }

    fwrite(biTree, sizeof(Node), numOfNodes, filePtr);

    fclose(filePtr);
    return 0;
}

这是 od 的输出:

0000020 0001 0000 484f 0000 0003 0000 0004 0000
0000040 0002 0000 4652 ffff 0005 0000 0006 0000
0000060 0003 0000 4657 0000 0007 0000 0008 0000
0000100 0004 0000 4557 0000 0009 0000 000a 0000
0000120 0005 0000 4152 0000 ffff ffff ffff ffff
0000140 0006 0000 4a41 0000 ffff ffff ffff ffff
0000160 0007 0000 414a 0000 ffff ffff ffff ffff
0000200 0008 0000 4c41 0000 ffff ffff ffff ffff
0000220 0009 0000 504e 0000 ffff ffff ffff ffff
0000240

任何能为我自己揭开神秘面纱的事情都会受到赞赏。这可能只是我的愚蠢,但谁知道呢。

标签: carraysioendianness

解决方案


推荐阅读