Вопрос

У меня просто есть небольшой вопрос о том, как получить длину файла, содержащего шестнадцатеричные числа.Например:

724627916C

Единственный способ, который я могу придумать, - это преобразовать шестнадцатеричное значение в двоичное:

724627916C => 0111001001000110001001111001000101101100

затем подсчитайте биты двоичного значения.Просто интересно, правильный ли это путь?Спасибо

Это было полезно?

Решение

НЕТ, это неправильный путь.

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

В принципе:Откройте файл, найдите до конца и восстановите свою текущую позицию.Что вы получите, так это количество байт в файле.

Редактировать:Ваш вопрос немного неясен.Вы хотите получить количество байт в файле или количество байт, представленное шестнадцатеричной строкой в файле?Если это так, и у вас нет пробелов в вашем файле, просто разделите количество байтов, возвращаемых описанным выше методом, на 2.

Другие советы

В операционных системах un*x, stat можно использовать для этой цели.

Пытаться этот ответ за помощь. Если это не работает, у Google есть много информации об определении размера файла в C.

Если вы хотите подсчитать биты, было бы проще настроить массив, который сообщает вам, сколько битов установлено в каждой шестнадцатеричной цифре (индексируется по коду символа), а затем добавьте вещи без явного преобразования в бинарный.

Предполагая 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