как записать данные из ядра в бинарный файл

Я использовал API для получения данных из ядра, API которого предоставляет информацию о деталях следующим образом.

#API INPUT:
#      size = 0x100 (User/driver will need to allocate buf of size*4,
             #                     since driver dump data in %02x format)

# API OUTPUT:
             #      buf = data copied to this buffer
             #      size = 0x100 * 4
             #      rv = return value.      None zero indicates error

Затем я хочу сохранить эти данные из ядра в двоичный файл.

char *buffer = malloc(0x100 *4);
FILE *fd;
fd = fopen("binfile", "wb");
...
fwrite(buffer, 1, 0x100 *4, fd);
...

Но я обнаружил, что содержимое этого бинарного файла является текстом. Я могу использовать «cat binfile», чтобы увидеть содержимое и вывести его следующим образом.

03 04 07 10 00 00 00 00 00 00 00 06 67 00 00 00 08 03 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50 2e 20 20 20 00 00 90 65 46 54 4c 58 38 35 37 31 44 33 42 4e 4c 2d 45 35 42 20 20 20 03 52 00 9b 00 1a 00 00 41 4d 51 30 43 36 31 20 20 20 20 20 20 20 20 20 31 32 30 36 31 34 20 20 68 f0 03 bc 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

И используйте «hexdump binfile», вывод выглядит следующим образом.

0000000 3330 3020 2034 3730 3120 2030 3030 3020
0000010 2030 3030 3020 2030 3030 3020 2030 3030
0000020 3020 2036 3736 3020 2030 3030 3020 2030
0000030 3830 3020 2033 3030 3120 2065 3634 3420
0000040 2039 6534 3420 2039 3335 3420 2031 3235
0000050 3220 2030 3334 3420 2066 3235 3520 2030
0000060 6532 3220 2030 3032 3220 2030 3030 3020
0000070 2030 3039 3620 2035 3634 3520 2034 6334
0000080 3520 2038 3833 3320 2035 3733 3320 2031
0000090 3434 3320 2033 3234 3420 2065 6334 3220
00000a0 2064 3534 3320 2035 3234 3220 2030 3032
00000b0 3220 2030 3330 3520 2032 3030 3920 2062
00000c0 3030 3120 2061 3030 3020 2030 3134 3420
00000d0 2064 3135 3320 2030 3334 3320 2036 3133
00000e0 3220 2030 3032 3220 2030 3032 3220 2030
00000f0 3032 3220 2030 3032 3220 2030 3133 3320
...
00002c0 3020 2030 3030 3020 2030 3030 3020 2030
00002d0 3030 3020 2030 3030 3020 2030 3030 3020
00002e0 2030 3030 3020 2030 3030 3020 2030 3030
00002f0 3020 2030 3030 3020 2030 3030 3020 2030
0000300 0000 0000 0000 0000 0000 0000 0000 0000
*
0000400 >>> it is 0x400

Но мое ожидаемое содержимое двоичного файла должно быть следующим.

0000000 0403 0007 0000 4000 0440 0670 0a8c 0000
0000010 0003 0a00 4946 494e 4153 2052 4f43 5052
0000020 202e 2020 0000 6590 5446 464c 3538 3932
0000030 3350 4e42 2d56 3545 3141 2020 5203 a900
0000040 3a00 0000 5155 3036 3030 2048 2020 2020
0000050 2020 2020 3331 3830 3430 2020 fa68 e505
0000060 0000 0000 0000 0000 0000 0000 0000 0000
*
0000100 >>> only 0x100

person xksyvone    schedule 21.10.2018    source источник
comment
Итак, что вы загрузили в буфер перед записью буфера в файл? Данные вроде как есть, но в шестнадцатеричном формате ASCII, так что я полагаю, это то, что вы загрузили?   -  person Martin James    schedule 21.10.2018
comment
Да, я печатаю буфер, прежде чем записывать их в файл, и буфер также имеет размер 0x30,0x33,0x20,0x30... что совпадает с тем, что я вижу в моем двоичном файле. Я предполагаю, что исходные данные из ядра представляют собой шестнадцатеричный код ASCII, поэтому я не могу получить ожидаемый двоичный формат. Но хочу подтвердить это.   -  person xksyvone    schedule 21.10.2018


Ответы (1)


Обратите внимание на следующее из комментария к вашему API:

(Пользователю/драйверу потребуется выделить buf размером *4, поскольку данные дампа драйвера имеют формат %02x)

Вы не случайно конвертируете его в текст; вот как API дает это вам. Вам нужно преобразовать его в двоичный файл самостоятельно. Как только вы это сделаете, вы можете просто написать его так, как вы есть сейчас, и он останется бинарным.

person Joseph Sible-Reinstate Monica    schedule 21.10.2018
comment
Спасибо. Итак, я могу сохранить его, как я сделал, а затем прочитать шестнадцатеричный код из двоичного файла, чтобы получить данные двоичного формата? - person xksyvone; 21.10.2018