当前位置: 首页 > 知识库问答 >
问题:

如何确保将4字节写入二进制文件

胡鸿禧
2023-03-14

我想编程一个16/32位的EEPROM。我正在用C程序编写这个文件,但是fwrite()似乎只执行8位?我写了一个简单的例子,使用xxd(和hextump)查看结果,但文件似乎只有8位。我想知道是否由于hexdump的限制,我只能看到8位

有人知道我如何检查所有的位都被写入文件吗?

#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位在哪里?理想情况下,我希望看到32位边界的0xFFFF中有16个0后跟16个1。

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

(我意识到文件名和文件指针没有关闭,只是我在2分钟内找到了一些东西来帮助显示问题,我从空中选择了255个。)

共有2个答案

邬良才
2023-03-14

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

解决方案:

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

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

慕容品
2023-03-14

要控制文件中的精确输出,应使用

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

此外,您不应该从大小为28字节的tmp数组中写入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;
}

 类似资料:
  • 问题内容: 我有23位表示为字符串,并且需要将此字符串作为4个字节写入二进制文件。最后一个字节始终为0。以下代码有效(Python 3.3),但感觉不太好(我对Python和编程很陌生)。您有任何改善技巧吗?似乎for循环可能有用,但是如何在循环中进行切片而不出现IndexError?请注意,当我将位提取到一个字节中时,我会反转位顺序。 问题答案: 您可以将其视为int,然后按以下方式创建4个字节

  • 我想以这种形式将短int x=0x4740写入二进制文件:0100 0000 0100 0111,当我在记事本中打开它时,它是@G。它正在工作。当我尝试编写例如短int a=0xf0ff;(二进制:1111 0000 1111 1111)时,记事本显示给我的不是我的数字二进制(➕是1100 1011 1001 1001 1100 0100 1001 0001)。如何在这个文件中编写它并获得1111

  • 问题内容: 我有一个字节列表作为整数,这类似于 如何将此列表作为二进制文件写入文件? 这行得通吗? 问题答案: 这正是用于: 如果您使用的是Python 3.x,则可以改用(也许应该这样做,因为它可以更好地表明您的意图)。但是在Python 2.x中,这是行不通的,因为它只是的别名。像往常一样,使用交互式解释器进行显示比使用文本进行解释要容易,所以让我这样做。 Python 3.x: Python

  • 我无法重写从二进制缓冲区获取的文件,我已与原始文件进行了检查,所有字节都相同。 这是从NodeJS创建的文件: 这是最初的一个: 你可以比较这两个文件,每个字节都是一样的,我猜NodeJS的编码不是正确的。 这是一段代码 你可以试着在你的节点上运行它,看看结果是错误的。 我能做些什么来修复它?

  • 问题内容: 我有一些从Go程序中读取的文本文件。我想提供一个可执行文件,而无需另外提供该文本文件。如何将其嵌入Windows和Linux上的编译中? 问题答案: 使用go-bindata。从自述文件: 该工具可将任何文件转换为可管理的Go源代码。对于将二进制数据嵌入到go程序中很有用。在转换为原始字节片之前,可以选择对文件数据进行gzip压缩。

  • 问题内容: 这一定很明显,但我无法弄清楚。我为此花了将近一整天。我很乐意给减轻我体重的人买啤酒。 这是我的代码。我看到字节数组大小不合适,但是我找不到正确的大小。除此之外,内容也不是不正确的。似乎只有文字字符可以。 似乎从二进制文件中删除数据确实很痛苦,我真的很沮丧。 还有一件事:文件内容不是文本,可以是图片,视频或pdf之类的东西。 问题答案: 如果你正在读一个二进制文件,你应该 不 尝试把它当