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

It is correct as you have it to write out the 14 bytes.

a technique is to create a struct with the layout of your records, then cast e.g. (C-style)

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

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

now you can get the contents of the first record

Record->name, ...

getting next record is just a matter of moving Record forward

++Record;

You could also have a struct for the header to make it more convenient to pickout the number of records, it is good to use stdint.h in order to get well defined sizes. also to pack structures on byte boundary to make sure no padding is done by the compiler i.e. #pragma pack(1) at the top of your source.

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;

so instead when you read you could do like this

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 に答える