バッファをとして宣言することによりchar*
、任意のポインタの算術インデックスまたは配列インデックスを使用sizeof(char)
してオフセットを計算します。charは1バイト(8ビット)です。
バッファ内のデータで何をしようとしているのかわかりません。ここにいくつかのアイデアがあります:
各バイトの値を10進数で出力し、ASCIIテキストとしてエンコードします。
for (int i=0; i < (1024*768); i++) {
fprintf(myFile, "%d , ", buffer[i]);
}
各バイトの値を16進数で出力し、ASCIIテキストでエンコードします。
for (int i=0; i < (1024*768); i++) {
fprintf(myFile, "%x , ", buffer[i]);
}
ASCIIテキストでエンコードされた各浮動小数点数の値を10進数で出力します(配列インデックスの計算は、各浮動小数点の隣接する重複しないメモリ位置を処理するのに正しいと思います):
for (int i=0; i < (1024*768); i += sizeof(float)) {
fprintf(myFile, "%6.4f , ", buffer[i]);
}
バッファを3つのファイルに分割します。各ファイルは、バッファの重複しないセクションからのものです。
fwrite(redPointer, sizeof(char), 768, file1);
fwrite(greenPointer, sizeof(char), 1024-768, file2);
fwrite(bluePointer, sizeof(char), (1024*768)-1024, file3);
fwriteのリファレンス。count
パラメータについては、質問でハードコーディングしたオフセットを単純にハードコーディングしたことに注意してください。また、特定のポインターを減算して、各領域のバイト数を計算することもできます。また、これら3つのファイルの内容は、元のデータの適切に独立したセクションである場合にのみ適切であることに注意してください。
多分これはあなたにいくつかのアイデアを与えます。
更新: フォーマット動作をコンパイルおよびテストするための完全なプログラムを作成しました。これにより、バッファから最初の20項目のみが出力されます。(を使用して)コンパイルしgcc -std=c99
て実行します。/tmp/data
を使用してファイルを作成し、ghex
ランダムなデータを入力しました。
#include <stdlib.h>
#include <stdio.h>
int main()
{
FILE* dataFile = fopen("/tmp/data", "rb");
if (dataFile == NULL)
{
printf("fopen() failed");
return -2;
}
unsigned char* buffer = (unsigned char*)malloc(1024*768);
if (buffer == NULL)
{
printf("malloc failed");
return -1;
}
const int bytesRead = fread(buffer,1,1024*768,dataFile);
printf("fread() read %d bytes\n", bytesRead);
// release file handle
fclose(dataFile); dataFile = NULL;
printf("\nDecimal:\n");
for (int i=0; i < (1024*768); i++) {
printf("%hd , ", buffer[i]);
if (i > 20) { break; }
}
printf("\n");
printf("\nHexadecimal:\n");
for (int i=0; i < (1024*768); i++) {
printf("%#0hx , ", buffer[i]);
if (i > 20) { break; }
}
printf("\n");
printf("\nFloat:\n");
for (int i=0; i < (1024*768); i += sizeof(float)) {
printf("%6.4f , ", (float)buffer[i]);
if (i > 20) { break; }
}
printf("\n");
return 0;
}