質問

16進数を含むファイルの長さを取得する方法について簡単な質問があります。例えば:

724627916C

私が考えることができる唯一の方法は、ヘックス値をバイナリに変換することです。

724627916C => 0111001001000110001001111001000101101100

次に、バイナリ値のビットをカウントします。これが正しい方法かどうか疑問に思っていますか?ありがとう

役に立ちましたか?

解決

いいえ、これは正しい方法ではありません。

FILE *fp = fopen("filename", "rb");
fseek(fp, 0, SEEK_END);
int lengthOfFile = ftell(fp);
fclose(fp);

原則として:ファイルを開き、最後まで探して、現在の位置を取得します。あなたが得るのは、ファイル内のバイト数です。

編集:あなたの質問は少し不明です。ファイル内のバイト数、またはファイル内の16進文字列で表されるバイト数を取得しますか?後者が当てはまり、ファイルに自家文がない場合は、上記の方法で返されるバイト数を2で割るだけです。

他のヒント

un*x likeオペレーティングシステムでは、 stat その目的に使用できます。

試す この答え いくつかの助けのために。それがうまくいかない場合、GoogleはCのファイルサイズの決定に関する多くの情報を持っています。

ビットをカウントしたい場合は、各16進数(文字コードでインデックス化されている)に設定されているビットの数を示す配列をセットアップする方が簡単になり、バイナリに明示的に変換せずに物事を追加します。

C99を仮定する:

static bits_map[256] =
{
    ['0'] = 0, ['1'] = 1, ['2'] = 1, ['3'] = 2,
    ['4'] = 1, ['5'] = 2, ['6'] = 2, ['7'] = 3,
    ['8'] = 1, ['9'] = 2,
    ['a'] = 2, ['b'] = 3, ['c'] = 2, ['d'] = 3,
    ['e'] = 3, ['f'] = 4,
    ['A'] = 2, ['B'] = 3, ['C'] = 2, ['D'] = 3,
    ['E'] = 3, ['F'] = 4,
};

size_t n_bits = 0;
int c;
while ((c = getchar()) != EOF)
    n_bits += bits_map[c];

printf("Number of bits set: %zd\n", n_bits);

Cのファイル長は関数を使用します _filelength()

#include <io.h>

int fn, fileSize;
FILE * f = fopen(&String, "rb");
if (f)
{
  fn = _fileno(f);
  fileSize = _filelength(fn);
}
fclose(f);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top