1

我想编程一个 16/32 位的 EEPROM。我正在从 C 程序编写文件,但fwrite()似乎只做 8 位?我写了一个简单的例子,并使用 xxd(和 hexdump)查看结果,但文件似乎只有 8 位。我想知道由于 hexdump 和 xxd 的限制,我是否只看到 8 位,或者问题出在fwrite()哪里?

任何人都知道我如何检查所有位是否都写入文件?

#include <stdio.h>
#include <stdlib.h>

const unsigned int dataSize = 255;
unsigned long tmp[] = { 0xFFFF, 0xFFDD, 0xFDDD, 0xF000, 0x0F0F, 0x0001, 0x1010 };
  
int main() {
    const char *path = "text.bin";
    FILE *fp = fopen(path, "wb"); 
    const void *data = tmp;
 
    if (!fp) {
        fprintf(stderr, "fopen() failed for '%s'\n", path);
    } else {
        fwrite(data, 1, dataSize, fp);
    }
  
    return 0;
}

使用xxd我看到:

00000000: ffff 0000 0000 0000 ddff 0000 0000 0000 ......
00000010: ddfd 0000 0000 0000 00f0 0000 0000 0000 ......
00000020: 0f0f 0000 0000 0000 0100 0000 0000 0000 ......
00000030: 1010 0000 0000 0000 0000 0000 0000 0000 ......
00000040:c005 5182 b27f 0000 0000 0000 0000 0000 ..Q......
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ......
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ......
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ......
00000080: 0000 0000 0000 0000 0000 0000 0000 0000 ......
00000090: 0000 0000 0000 0000 0000 0000 0000 0000 ......
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ......
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ......
000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ......
000000d0: 0000 0000 0000 0000 0000 0000 0000 0000 ......
000000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ......
000000f0: 0000 0000 0000 0000 0000 0000 0000 00 ......

编辑:我试图确保有 32 位写入文件。xxd的结果是:

00000000: 11111111 11111111 00000000 00000000 00000000 00000000 ......

哪个显示有 16 位,0xFFFF但其他 16 位在哪里?0xFFFF理想情况下,对于 32 位边界,我希望看到 16 个零,然后是 16 个零。

我想知道这是否是xxd软件没有显示它的问题,而不是 C 没有写它。

(我意识到名称和文件指针没有关闭,这只是我在 2 分钟内敲出的东西以帮助显示问题,我从空中选择了 255。)

4

2 回答 2

1

要控制文件中的确切输出,您应该使用确切的宽度类型,<stdint.h>而不是unsigned long,这在您的系统上似乎有 64 位。

您没有看到 16 个 0 后跟 16 个 1 的原因是您的目标系统对大于 8 位的整数类型使用 little-endian 表示。字节序决定了这些类型在内存中的字节顺序。

此外,您不应该从tmp大小为 28 字节的数组中写入 255 字节。

这是修改后的版本:

#include <stdio.h>
#include <stdint.h>

// data has 256 bytes
uint32_t data[64] = { 0xFFFF, 0xFFDD, 0xFDDD, 0xF000, 0x0F0F, 0x0001, 0x1010 };
  
int main() {
    const char *path = "text.bin";
    FILE *fp = fopen(path, "wb"); 
 
    if (!fp) {
        fprintf(stderr, "fopen() failed for '%s'\n", path);
    } else {
        size_t written = fwrite(data, 1, sizeof data, fp);
        if (written != sizeof data) {
            fprintf(stderr, "fwrite() only wrote %zu bytes\n", written);
        }
        fclose(fp);
    }
    return 0;
}
于 2021-02-13T14:17:01.120 回答
0

问题:16 位数据(2 字节)块存储在 64 位类型(8 字节)数组中。这解释了输出。

解决方案:

  • 将 x 字节数据分配给“x 字节类型”(使用“固定宽度整数类型”)
  • fwrite 确切的字节数(不要猜测)

请注意,0xFFFF 是 2 个字节。分配的数据为 7 * 2 = 14 个字节。“tmp”数组是 7 * 8 = 56 字节。

于 2021-02-13T14:19:26.160 回答