Фред, кажется, читает файл справа налево - PullRequest
2 голосов
/ 16 июня 2019

Мне нужно прочитать информацию из файла bin (это 100k 6-байтовых направлений Ethernet). Я открыл его с редактором, и это то, что внутри: enter image description here

поэтому используйте код:

 FILE *ptr;
    ptr = fopen("ethdirs.bin", "r");
    if (!ptr){
        printf("Unable to open file");
    }
    uint64_t test;
    fread(&test, 6, 1, ptr);
    printf("result = %lx \n", test);
    fread(&test, 6, 1, ptr);
     printf("result = %lx \n", test);
    fclose(ptr);

должен вывести 1B26B354A1CF, который является первым направлением в 6 байтов. Тем не менее, он печатает:

результат = cfa154b3261b

это именно то направление, которое я ожидаю, но читаю справа налево! Почему это происходит и как мне это решить?

1 Ответ

4 голосов
/ 16 июня 2019

У вас немного проблем с порядком байтов. Ethernet с прямым порядком байтов, но ваш процессор с прямым порядком байтов.

К сожалению, нет встроенной функции для преобразования шести байтов, поэтому вы должны сделать это самостоятельно.

uint64_t test;
unsigned char convert[6];
fread(convert, 6, 1, ptr);
test =
    ((uint64_t)convert[0] << 40) |
    ((uint64_t)convert[1] << 32) |
    ((uint64_t)convert[2] << 24) |
    ((uint64_t)convert[3] << 16) |
    ((uint64_t)convert[4] << 8) |
    ((uint64_t)convert[5]);

Кто-то может найти более быстрый битбэш, но вам, вероятно, все равно.

В качестве альтернативы (в зависимости от того, что вы делаете) вы можете просто напечатать его в нужном вам порядке:

unsigned char convert[6];
fread(convert, 6, 1, ptr);
//...
printf("%02X:%02X:%02X:%02X:%02X:%02X\n", convert[0], convert[1], convert[2], convert[3], convert[4], convert[5]);

Я позволил себе вставить на этот раз ожидаемые: разделители в MAC-адресах.

...