从C

时间:2017-01-26 14:47:30

标签: c hex readfile

我正在尝试使用C从图像文件中读取十六进制值。在Linux中,此代码工作正常,但在Windows中它只读取前334个字节,我不明白为什么。

读取文件的代码是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>    
void readHexFile(char* path) {
        FILE *fp;

        if ((fp = fopen (path, "r")) != NULL) {
            struct stat st;
            stat(path, &st);                

            int i;
            int ch;
            for (i = 0; i < st.st_size; i++) {
                ch = fgetc(fp);             
                printf("%x ", ch);
            }

            fclose(fp);
        }
        else {
            return NULL;
        }
}

st.st_size来自<sys/stat.h>包,包含正确的值(图像文件的大小,以字节为单位)

此图像显示我的程序输出的内容,以及它正在读取的文件的实际二进制内容:

enter image description here 正如您在171819序列后看到的那样,还有十六进制值,但我的程序会反复打印ffffffff

3 个答案:

答案 0 :(得分:5)

您以文本模式打开文件,而不是二进制。不同的平台可能表现不同。

在这种情况下,Microsoft Windows决定此纯文本文件在第一次出现Ctrl+Z0x1A)时结束,之后返回EOF所有fgetc

明确声明您要将文件打开为二进制文件:

fp = fopen ("yourfile", "rb");

问题就消失了。

答案 1 :(得分:1)

我认为你的循环应该是这样的:

int ch;
while (!feof(fp)) {
    ch = fgetc(fp);
    printf("%x ", ch);
}

我完全不清楚为什么你在这里使用st.st_size

答案 2 :(得分:1)

在Windows上,字符<div id="workers" /> <script type="text/javascript"> function getWorkers() { var dateToView = nv.selectionStart.toString(); dateToView = dateToView.slice(0, 10); $.ajax({ type: "POST", url: "/Home/GetWorkers", data: { date: dateToView }, success: function (data) { var markup = '<ul id="workersList">'; for (var i = 0; i < data.length; i++) { var start = new Date(parseInt(data[i].PlanStart.replace('/Date(', ''))); start = start.toLocaleTimeString(); var end = new Date(parseInt(data[i].PlanEnd.replace('/Date(', ''))); end = end.toLocaleTimeString(); markup += '<li data-id="' + data[i].WorkSchedulerID + '"><span style="cursor:move">' + data[i].Username + ' ' + start + ' - ' + end + '</span></li>'; } markup += '</ul>'; $('#workers').html(markup); } }); } </script> <script type="text/javascript"> function makeDraggable() { getWorkers(); setTimeout(function () { console.log("THIS IS"); }, 2000); var parent = document.getElementById("workersList"); var items = parent.getElementsByTagName("li"); for (var i = 0; i < items.length; i++) { var e = items[i]; var item = { element: e, id: e.getAttribute("data-id"), text: e.innerText, duration: e.getAttribute("data-duration"), keepElement: true }; DayPilot.Scheduler.makeDraggable(item); } } </script> (Ctrl + Z)文本模式的EOF字符;见this question

如果你正在读取像JPEG这样的二进制文件,你应该首先将文件打开为二进制文件(0x1A模式fopen),然后"rb"进入一个预先分配的缓冲区,其大小由fread确定,文件指针位于文件的末尾:

ftell