gpt4 book ai didi

C 读取二进制标准输入

转载 作者:行者123 更新时间:2023-12-02 07:43:22 25 4
gpt4 key购买 nike

我正在尝试构建一个指令管道模拟器,但在开始时遇到了很多麻烦。我需要做的是从标准输入读取二进制文件,然后在操作数据时以某种方式将其存储在内存中。我需要一个接一个地读取正好 32 位的 block 。

如何一次读取 32 位的 block ?其次,我如何存储它以供以后操作?

这是我到目前为止所得到的,但是检查我进一步阅读的二进制 block ,它看起来不太正确,我认为我没有完全按照我需要的方式读取 32 位。

char buffer[4] = { 0 }; // initialize to 0
unsigned long c = 0;
int bytesize = 4; // read in 32 bits
while (fgets(buffer, bytesize, stdin)) {
memcpy(&c, buffer, bytesize); // copy the data to a more usable structure for bit manipulation later
// more stuff
buffer[0] = 0; buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; // set to zero before next loop
}
fclose(stdin);

如何一次读取 32 位(它们都是 1/0,没有换行符等),以及将其存储在什么中,char[] 可以吗?

编辑:我能够读取二进制文件,但没有一个答案以正确的顺序生成这些位 - 它们都被破坏了,我怀疑字节序和读取和移动 8 位(1 个字符)的问题时间 — 这需要在 Windows 和 C 上运行...?

最佳答案

您需要的是freopen() 。从联机帮助页:

If filename is a null pointer, the freopen() function shall attempt to change the mode of the stream to that specified by mode, as if the name of the file currently associated with the stream had been used. In this case, the file descriptor associated with the stream need not be closed if the call to freopen() succeeds. It is implementation-defined which changes of mode are permitted (if any), and under what circumstances.

基本上,您真正能做的最好的事情就是:

freopen(NULL, "rb", stdin);

这将重新打开 stdin 使其成为相同的输入流,但处于二进制模式。在正常模式下,在 Windows 上读取 stdin 会将 \r\n(Windows 换行符)转换为单个字符 ASCII 10。使用 "rb" 模式禁用此转换,以便您可以正确读取二进制数据。

freopen() 返回一个文件句柄,但它是以前的值(在我们将其置于二进制模式之前),因此不要将其用于任何用途。之后,使用fread()正如已经提到的。

但是,至于您的担忧,您可能不会以“32 位”读取,但如果您使用 fread(),您以 4 读取char(这是您在 C 中可以做的最好的事情 - char 保证至少 8 位,但一些历史和嵌入式平台有 16 位char(有些甚至有 18 个或更差))。如果您使用fgets(),您将永远读取4个字节。您将至少读入 3 个字节(取决于其中是否有换行符),并且第 4 个字节将是 '\0' 因为 C 字符串以 nul 结尾并且 fgets() nul 终止它所读取的内容(就像一个好的函数)。显然,这不是您想要的,因此您应该使用fread()

关于C 读取二进制标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1598985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com