Как сохранить «шестнадцатеричные данные» в файл (ASCII) в CAPL, включая символ «NULL» (0x00)? - PullRequest
0 голосов
/ 17 мая 2019

В коде CAPL у меня есть массив "byte []", этот массив должен содержать значения "Hex" (00..FF).

Проблема заключается в том, что при попытке сохранитьмассив «Hex» для файла в формате «ASCII», он полностью игнорирует «00» (который является символом «NULL»), что приводит к повреждению выходного файла.

variables
{
    byte UploadedData[56, 41, 4C, 00, 01, 02, 00, 02];
    char ExportedTextFile[9];
    char FileName[32] = "FlasherImage.can";
    dword FileHandle = 0;
}

void ExportDataFile(void)
{  
    int u16Index = 0;


    FileHandle = OpenFileWrite(FileName, 0);  

    for (u16Index = 0; u16Index < 8; u16Index++)
    { 
        snprintf(ExportedTextFile, elcount(ExportedTextFile), "%c", UploadedData[u16Index]);

        filePutString(ExportedTextFile, elcount(ExportedTextFile), FileHandle);
    }

    fileClose(FileHandle);
}

Ожидаемый файл будет: VALNULSOHSTXNULSTX

Полученный файл («NUL» игнорируется): VALSOHSTXSTX

где: V: Символ «V».A: Персонаж «А».L: символ «L».NUL: управляющий символ "NULL".SOH: управляющий персонаж «Начало заголовка».STX: управляющий символ «Начало текста».

Пожалуйста, помогите мне с любым решением или обходным путем.

Большое спасибо.

1 Ответ

0 голосов
/ 18 мая 2019

Я нашел ответ :)

Проще говоря, не пишите в режиме «ASCII» и не используйте «snprintf ()», который интерпретирует «двоичные данные» как «данные ASCII» (символы).

Новый код:

void ExportBinaryFile(void)
{    
  FileHandle = OpenFileWrite(FileName, 1); 
  fileWriteBinaryBlock(UploadedData, elcount(UploadedData), FileHandle);
  fileClose(FileHandle);
}
...