Оборачивать двоичный файл данных для самостоятельного преобразования в CSV? - PullRequest
1 голос
/ 31 января 2012

Я пишу специальную прошивку для SparkFun Logomatic V2, которая записывает двоичные данные в файл на карте памяти microSD объемом 2 ГБ. Размер файла данных будет варьироваться от 100 МБ до 1 ГБ.

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

Я знаю, как создать Here Document, но я подозреваю, что Bash не сможет быстро проанализировать и преобразовать гигабайт двоичных данных, поэтому я бы хотел, чтобы процесс выполнялся намного быстрее, если скрипт сначала скомпилирует немного C код (предположим, что GCC присутствует и находится в пути), затем запустите получившуюся программу, передав двоичные данные в стандартный ввод.

Чтобы конкретизировать проблему, предположим, что микропрограмма создаст двоичные данные, состоящие из 4 16-разрядных целочисленных значений: метка времени (без знака), за которой следуют 3 оси акселерометра (со знаком). Разделителя между записями нет (в основном потому, что я насыщаю интерфейс SPI для карты uSD).

Итак, я думаю, что мне нужен скрипт с ДВУМЯ документами: один для кода C (параметризованный расширенными переменными Bash), а другой для двоичных данных. Вот где я до сих пор:

#! env bash
# Produced by firmware version 0.0.0.0.0.1 alpha
# Configuration for this data run:
header_string = "Time, X, Y, Z"
column_count = 4
# Create the converter executable
# Use "<<-" to permit code to be indented for readability.
# Allow variable expansion/substitution.
gcc -xc /tmp/convertit - <<-THE_C_CODE
    #include <stdio.h>
    int main (int argc, char **argv) {
        // Write ${header_string} to stdout
        while (1) {
            // Read $(column_count} shorts from stdin
            // Break if EOF
            // Write $(column_count} comma-delimited values to stdout
        }
        // Close stdout
        return 0;
    }
THE_C_CODE
# Pass the binary data to the converter
# Hard-quote the Here tag to prevent subsequent expansion/substitution
/tmp/convertit >./$1.csv <<'THE_BINARY_DATA'
...
... hundreds of megabytes of semi-random data ...
...
THE_BINARY_DATA
rm /tmp/convertit
exit 0

Это выглядит правильно? У меня пока нет реального файла данных, чтобы проверить это, но я хотел проверить идею, прежде чем идти дальше.

Будет ли Bash жаловаться на отсутствие пропущенных строк? Это может произойти, если захват данных неожиданно прекратится из-за удара током, который приведет к разрядке аккумулятора или карты USB. Или если прошивка не работает.

Есть ли более быстрый или лучший метод, который я должен рассмотреть? Например, мне интересно, будет ли Bash слишком медленно копировать двоичные данные так быстро, как их может использовать программа C: Должна ли программа C открывать файл данных напрямую?

ТИА

-BobC

1 Ответ

1 голос
/ 25 февраля 2012

Возможно, вы захотите взглянуть на makeself .Это позволяет вам преобразовать любой архив .tar.gz в самораспаковывающийся файл, который не зависит от платформы (что-то вроде скрипта оболочки, содержащего документ здесь).Это позволит вам легко распространять ваши данные и декодер.Это также позволяет настроить скрипт, содержащийся в архиве, который будет запускаться при запуске скрипта контейнера.Таким образом, вы можете использовать makeself для упаковки, а внутри архива вы можете поместить свои файлы данных и декодер, написанные на C или bash или на любой другой язык, который вы считаете подходящим.

Хотя можно декодировать двоичные данные с помощью инструментов оболочки (например, используя od), это очень громоздко и неэффективно.Я бы порекомендовал использовать либо программу на C, либо perl, которую также можно найти практически на любом компьютере (проверьте эта страница ).

...