2009-09-25 2 views
3

Я ищу, чтобы написать пару утилит, которые читаются в списке строк целых чисел, разделенных символом новой строки, и выводит их двоичный (4 байт) эквивалент stdout и наоборот.Двоичный stdin и stdout

Моя первая мысль была простой командой bash/linux, которая сделала бы это, но я не смог ее найти. Моя вторая мысль заключалась в том, чтобы сделать это на C++, но я не могу понять, как изменить stdin или stdout на двоичный поток.

Любые мысли о хорошем способе сделать это? Я беспристрастен к любому конкретному языку программирования.

ответ

5

В Perl, вы можете просто попробовать:

perl -ne 'chomp; print pack 'i', $_;' 

Это даст вам хост родной подписал целое, по меньшей мере, 32 бит, но, возможно, больше, в зависимости от вашего местного компилятора C.

Другие варианты упаковки могут использоваться вместо 'i', например 'l', который даст вам подписанный длинный, который должен быть 32-битным. И еще есть варианты для little-endian или big-endian.

Полное описание, пожалуйста, см. http://perldoc.perl.org/functions/pack.html.

И вот ваше решение в C, если вы хотите сделать это скучным способом. :)

#include <stdio.h> 

int main() { 
    int x; 

    while (fscanf(stdin, "%i", &x)) { 
     fwrite(&x, sizeof(x), 1, stdout); 
    } 

    return 0; 
} 
+0

Спасибо, что бит perl велик. – Rich

+0

Не беспокойтесь ... рад, что я мог бы помочь. –

4

Вам не нужно «менять stdout на двоичный», просто выводить на него двоичный код. Это, конечно, смущает, например. эмулятор терминала, подключенный к этому потоку, но это следует ожидать.

Простая петля fscanf(), чтобы читать каждое целое число, за которым следует fwrite(), чтобы написать его, должно работать. Помните о проблемах с контентом, хотя вы можете вывести каждый байт отдельно.

+0

Стоит упомянуть endian-ness (поэтому Unix предпочитает текст), хотя там, где вы подключаетесь к программе, оба находятся на одной машине. Если вы использовали вместо этого сокет (для программы на отдельном компьютере), то вступает в игру endian-ness. –

1

В Unix и ее производных, нет необходимости беспокоиться о ли STDIN или STDOUT являются «двоичный» режим - бинарные и текстовые режимы одинаковы. Я не проводил обширное тестирование в Windows, но под Cygwin я тоже не заметил никаких проблем.

+0

Правильно, я думаю, моя проблема в том, что я не понял, как вывести число «в двоичном режиме». 'cout << 256;' выводит 3 символа ascii «256», а не бинарный эквивалент. – Rich

+1

@Rich: да; cout принимает текст и преобразует материал в текст по умолчанию. Вместо этого следует использовать аналог C 'fwrite()'. –