0

我正在尝试了解有关二进制文件的更多信息,因此我从 HexEdit 开始,我手动编写了一个文件并为其创建了一个模板。这是我的工作:

在此处输入图像描述

现在,我开始在 C++ Win32 中开发一个控制台应用程序,以读取该文件中的内容并使它们看起来友好。这是我的部分代码:

typedef unsigned char BYTE;

long getFileSize(FILE *file)
{
    long lCurPos, lEndPos;
    lCurPos = ftell(file);
    fseek(file, 0, 2);
    lEndPos = ftell(file);
    fseek(file, lCurPos, 0);
    return lEndPos;
}

int main()
{
    const char *filePath = "D:\\Applications\\ColorTableApplication\\file.clt";
    BYTE *fileBuf;          // Pointer to our buffered data
    FILE *file = NULL;      // File pointer

    if ((file = fopen(filePath, "rb")) == NULL)
        printf_s("Could not open specified file\n");
    else {
        printf_s("File opened successfully\n");
        printf_s("Path: %s\n", filePath);
        printf_s("Size: %d bytes\n\n", getFileSize(file));
    }

    long fileSize = getFileSize(file);

    fileBuf = new BYTE[fileSize];

    fread(fileBuf, fileSize, 1, file);

    for (int i = 0; i < 100; i++){
        printf("%X ", fileBuf[i]);
    }

    _getch();
    delete[]fileBuf;
        fclose(file);   // Almost forgot this 
    return 0;
}

(我提供了这么多代码,因为我想清楚,以帮助您了解我正在尝试做什么)

首先,我需要获取前 14 个字节并将它们作为文本写入控制台,然后,for我需要为每种颜色编写类似这样的内容:

black      col_id = 1; R = 00; G = 00; B = 00;
red        col_id = 2; R = FF; G = 00; B = 00;
etc...

如何读取和翻译这些字节?

4

1 回答 1

1

这是正确的,因为您可以写出 14 个字节。

一种技术是使用记录的布局创建一个结构,然后进行转换,例如(C 风格)

typedef struct
{
  char name[10];
  long col_id; 
  unsigned char R;
  unsigned char G;
  unsigned char B;
} rec;

rec* Record = (rec*)(fileBuf + StartOffsetOfRecords);

现在您可以获取第一条记录的内容

Record->name, ...

获得下一个记录只是Record前进的问题

++Record;

您还可以为标头设置一个结构,以便更方便地选择记录数,最好使用 stdint.h 以获得明确定义的大小。还要在字节边界上打包结构,以确保编译器没有填充,即#pragma pack(1)在源代码的顶部。

typedef struct 
{
  char signature[14];
  uint32_t tableaddress;
  uint32_t records; 
} header;

typedef struct
{
  char name[10]; 
  uint32_t col_id;
  unsigned char R;
  unsigned char B;
  unsigned char G;

} rec;

因此,当您阅读时,您可以这样做

header Header;
rec* Record;

fread(&Header,sizeof(header),1,file);
fread(fileBuf,1,fileSize,file);

Record = (rec*)(fileBuf); // first record can be accessed through Record
于 2013-08-02T08:47:33.987 回答