Странный 0x0D добавляется в мой двоичный файл - PullRequest
13 голосов
/ 04 апреля 2011

У меня странная проблема:

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

Вот мой код:

for(i = 0; i < 16; i++)
{
    if(i < strlen(inputStr))
    {
        myCharBuf[0] = inputStr[i];
    }
    else
    {
        myCharBuf[0] = 0;
    }

    fwrite(myCharBuf, sizeof(char), 1, myFile);
}

myIntBuf[0] = inputNumber1;

fwrite(myIntBuf, sizeof(int), 1 ,myFile);

myIntBuf[0] = inputNumber2;

fwrite(myIntBuf, sizeof(int), 1 ,myFile);

myIntBuf[0] = inputNumber3;

fwrite(myIntBuf, sizeof(int), 1 ,myFile);

Я получаю следующие байтовые значения:

61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0D 0A 00 00 00 05 00 00 00 08 00 00 00

Когда я ожидаю:

61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0A 00 00 00 05 00 00 00 08 00 00 00

У кого-нибудь есть идеи, почему это может произойти?

Ответы [ 6 ]

16 голосов
/ 04 апреля 2011

0A - символ перевода строки, а 0D - возврат каретки.Обычно они связаны с текстовым режимом.

Вы открыли файл в двоичном режиме?(например fopen("foo.txt", "wb"))

11 голосов
/ 04 апреля 2011

Когда вы открываете файл, открываете для записи в двоичном виде "wb":

fopen(filename, "wb");

При открытии в текстовом режиме происходит перевод строк (0A) и возврата каретки (0D).

7 голосов
/ 04 апреля 2011

fopen файл в двоичном режиме с "wb".

fopen(filename, "wb");

в противном случае код в библиотеке будет выполнять автоматический перевод конца строки (в Windows вы находитесь в Windows, не так ли? , что означает перевод '\n' в '\r' '\n' ).

1 голос
/ 04 апреля 2011

MS-DOS (и сегодня на Windows) при записи файла в текстовом режиме добавляет 0x0D перед каждым 0x0A.Другими словами, он обрабатывает произвольные потоки данных по мере их поступления в хранилище и из него и портит их данные - совершенно безумно.

Откройте файл в двоичном режиме для ненормальной обработки.

0 голосов
/ 29 ноября 2014

Этот код

    #include <stdio.h>

#define SECTORSIZE 512 // bytes per sector

int main(int argc, char *argv[])
{
 FILE *fp;     // filepointer
 size_t rdcnt; // num. read bytes
 unsigned char buffer[SECTORSIZE];

 if(argc < 2)
 {
  fprintf(stderr, "usage:\n\t%s device\n", argv[0]);
  return 1;
 }

 fp = fopen(argv[1], "rb");
 if(fp == NULL)
 {
  fprintf(stderr, "unable to open %s\n",argv[1]);
  return 1;
 }

 rdcnt = fread(buffer, 1, SECTORSIZE, fp);
 if(rdcnt != SECTORSIZE)
 {
  fprintf(stderr, "reading %s failed\n", argv[1]);
  fclose(fp);
  return 1;
 }

 fwrite(buffer, 1, SECTORSIZE, stdout);
 fclose(fp);
 return 0;
}

любезно взят отсюда https://redeaglesblog.wordpress.com/2011/04/05/sektoren-eines-datentragers-lesen/

считывает загрузочный сектор с любого данного диска

Вставляется в том виде, в каком он находится в выбранном вами C (ANSI) IDE или редактор, он компилируется и работает либо в Windows (передача mingw \. \ PhysicalDriveX), либо в linux (передача gcc / dev / sdX)

Но он работает ТОЛЬКО в Linux, хотя в любом случае вставляет/ добавляет x0D, предшествующий любому x0A, несмотря на fp = fopen(argv[1], "rb");

Я скомпилировал его из code :: blocks с mingw как readsect.exe и запустил, читая загрузочный сектор моего жесткого диска

c:\readsect.exe \\.\PhysicalDrive0 > read.bin

Файл read.bin имеет длину 515 байт вместо 512.

С помощью редактора HEX, способного открывать физические диски, я сравнил содержимое моего загрузочного сектора с файлом read.bin.

Ну, каждый x0A в физическом загрузочном секторе (x0A найден 3 раза) в файле read.bin сбрасывается как x0D + X0A.Итак, у меня есть три x0D, на три байта больше.

Googleing, похоже, это широко распространенная проблема.

Кто-нибудь из вас нашел исправление?Может быть, stdio.h нужно исправить для Windows?

Спасибо

0 голосов
/ 04 апреля 2011

Я полагаю, что ваша переменная inputStr содержит символ новой строки и записывается в двоичный файл как возврат каретки и перевод строки - двоичный '0D' с последующим '0A'.

Например, следующая программа пишет16 символов и 3 цифры следующим образом.

FILE *fp;

    fp = fopen("sample.bin", "wb+");

    if(fp == NULL)
    {
        printf("Cannot create a file\n");
        return;
    }

    int i;
    char c[1] = {'A'};

    for(i = 0; i < 16; i++)
    {
        fwrite(c, sizeof(char), 1, fp);
        c[0]++;
    }

    int ip[1] = {1};
    fwrite(ip, sizeof(int), 1, fp);
    fwrite(ip, sizeof(int), 1, fp);
    fwrite(ip, sizeof(int), 1, fp);
    fclose(fp);

Если файл 'sample.bin' просматривается с помощью программы дампа, такой как 'od', он выдает содержимое следующим образом.

od -t x1 -c sample.bin
0000000    41  42  43  44  45  46  47  48  49  4a  4b  4c  4d  4e  4f  50
           A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P
0000020    01  00  00  00  01  00  00  00  01  00  00  00                
         001  \0  \0  \0 001  \0  \0  \0 001  \0  \0  \0                
0000034
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...