Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C语言中从文件中读取二进制输入_C_Binaryfiles_Fread - Fatal编程技术网

如何在C语言中从文件中读取二进制输入

如何在C语言中从文件中读取二进制输入,c,binaryfiles,fread,C,Binaryfiles,Fread,我需要做的是从文件中读取二进制输入。例如,输入为(二进制转储) 我所做的是 char* filename = vargs[1]; BYTE buffer; FILE *file_ptr = fopen(filename,"rb"); fseek(file_ptr, 0, SEEK_END); size_t file_length = ftell(file_ptr); rewind(file_ptr); for (int i = 0; i < file_length; i

我需要做的是从文件中读取二进制输入。例如,输入为(二进制转储)

我所做的是

char* filename = vargs[1];

BYTE buffer;

FILE *file_ptr = fopen(filename,"rb");


fseek(file_ptr, 0, SEEK_END); 

size_t file_length = ftell(file_ptr);

rewind(file_ptr);  

for (int i = 0; i < file_length; i++)
{
   fread(&buffer, 1, 1, file_ptr); // read 1 byte
   printf("%d ", (int)buffer);
}
它以ASCII数字显示

如何将输入读取为二进制数,而不是ASCII数

输入应按以下方式使用:

0 # Padding for the whole file! 
0000|0000 # Function 0 with 0 arguments 
00000101|00|000|01|000 # MOVE the value 5 to register 0 (000 is MOV function)
00000011|00|001|01|000 # MOVE the value 3 to register 1 
000|01|001|01|100 # ADD registers 0 and 1 (100 is ADD function)
000|01|0000011|10|000 # MOVE register 0 to 0x03 
0000011|10|010 # POP the value at 0x03 
011 # Return from the function 
00000110 # 6 instructions in this function
我试图实现一些类似于汇编语言的命令

有人能帮我解决这个问题吗


谢谢

您需要了解数据及其表示之间的差异。您正在正确读取二进制数据。打印数据时,
printf()
给出二进制数据的十进制表示形式。请注意,二进制中的
00001010
与十进制中的
10
相同,二进制中的
00000100
与十进制中的
4
相同。如果您将每个位序列转换为十进制值,您将看到输出完全正确。您似乎混淆了数据的表示形式,因为它是输出,而数据是如何读取和存储在内存中的。这是两件截然不同的事情


解决问题的下一步是学习按位运算符:
&
~
>
、和
所使用的格式不能被字节整除,因此需要将位读入循环缓冲区,并用状态机对其进行解析

阅读“二进制”或“文本”是完全相同的事情,唯一改变的是你对数据的解释。在您的示例中,您正在读取一个字节,并且正在打印该字节的十进制值。但要打印字符的位,只需要使用C的二进制运算符

例如:

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <limits.h>

struct binary_circle_buffer {
    size_t i;
    unsigned char buffer;
};

bool read_bit(struct binary_circle_buffer *bcn, FILE *file, bool *bit) {
    if (bcn->i == CHAR_BIT) {
        size_t ret = fread(&bcn->buffer, sizeof bcn->buffer, 1, file);
        if (!ret) {
            return false;
        }
        bcn->i = 0;
    }
    *bit = bcn->buffer & ((unsigned char)1 << bcn->i++); // maybe wrong order you should test yourself
    // *bit = bcn->buffer & (((unsigned char)UCHAR_MAX / 2 + 1) >> bcn->i++);
    return true;
}

int main(void)
{
    struct binary_circle_buffer bcn = { .i = CHAR_BIT };

    FILE *file = stdin; // replace by your file
    bool bit;
    size_t i = 0;
    while (read_bit(&bcn, file, &bit)) {
        // here you must code your state machine to parse instruction gl & hf
        printf(bit ? "1" : "0");
        if (++i >= 7) {
            i = 0;
            printf(" ");
        }
    }
}
#包括
#包括
#包括
#包括
结构二进制循环缓冲区{
尺寸i;
无符号字符缓冲区;
};
bool读取位(结构二进制循环缓冲区*bcn,文件*FILE,bool*位){
如果(bcn->i==CHAR\u位){
size\u t ret=fread(&bcn->buffer,sizeof bcn->buffer,1,file);
如果(!ret){
返回false;
}
bcn->i=0;
}
*bit=bcn->buffer&((unsigned char)1i++);//也许您应该测试自己的顺序错误
//*bit=bcn->buffer&((无符号字符)UCHAR_MAX/2+1)>>bcn->i++);
返回true;
}
内部主(空)
{
结构二进制\u循环\u缓冲区bcn={.i=CHAR\u位};
FILE*FILE=stdin;//替换为您的文件
布尔比特;
尺寸i=0;
while(读取位(&bcn、文件和位)){
//在这里,您必须对状态机进行编码,以解析指令gl和hf
printf(位?“1”:“0”);
如果(++i>=7){
i=0;
printf(“”);
}
}
}

帮助您完成更多将是困难的,您基本上是在请求帮助编写虚拟机…

也许我不明白您所说的二进制输入是什么意思?你需要直接读号码吗?在这种情况下,您的格式是什么?是的!我需要直接读取二进制数。作为缓冲区打印-“0”给了我奇怪的输出..好的,但我们需要信息,您的数据的格式是什么?小端,大端,多少字节?多少位?现在有太多的可能性给你一个正确的答案。我在你的例子中计算了53位,这似乎很奇怪。好吧,这将是一个很长的答案;)现在您的问题更清楚了。您输入的是
3-整数
值、
6-短
值或
12字符
值。您可以将输入读入任意一个的数组,然后根据需要使用逐位运算符提取位。
0 # Padding for the whole file! 
0000|0000 # Function 0 with 0 arguments 
00000101|00|000|01|000 # MOVE the value 5 to register 0 (000 is MOV function)
00000011|00|001|01|000 # MOVE the value 3 to register 1 
000|01|001|01|100 # ADD registers 0 and 1 (100 is ADD function)
000|01|0000011|10|000 # MOVE register 0 to 0x03 
0000011|10|010 # POP the value at 0x03 
011 # Return from the function 
00000110 # 6 instructions in this function
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <limits.h>

struct binary_circle_buffer {
    size_t i;
    unsigned char buffer;
};

bool read_bit(struct binary_circle_buffer *bcn, FILE *file, bool *bit) {
    if (bcn->i == CHAR_BIT) {
        size_t ret = fread(&bcn->buffer, sizeof bcn->buffer, 1, file);
        if (!ret) {
            return false;
        }
        bcn->i = 0;
    }
    *bit = bcn->buffer & ((unsigned char)1 << bcn->i++); // maybe wrong order you should test yourself
    // *bit = bcn->buffer & (((unsigned char)UCHAR_MAX / 2 + 1) >> bcn->i++);
    return true;
}

int main(void)
{
    struct binary_circle_buffer bcn = { .i = CHAR_BIT };

    FILE *file = stdin; // replace by your file
    bool bit;
    size_t i = 0;
    while (read_bit(&bcn, file, &bit)) {
        // here you must code your state machine to parse instruction gl & hf
        printf(bit ? "1" : "0");
        if (++i >= 7) {
            i = 0;
            printf(" ");
        }
    }
}