Конвертировать шестнадцатеричный поток в GIF - PullRequest
3 голосов
/ 20 июля 2011

Как мне создать файл .gif из следующего потока HEX:

0d 0a 0d 0a 47 49 46 38 39 61 01 00 01 00 80 FF 00 FF FF FF 00 00 00 2c 00 00 00 00 01 00 01 00 00 02 02 44 01 00 3b

3b - терминатор файла GIF

Я пытаюсь сделать это, следуя инструкциям на http://en.wikipedia.org/wiki/Graphics_Interchange_Format#Example_GIF_file

Я бы хотел реализовать это либо в Perl, либо в C / C ++. Любой язык подойдет, хотя.

Большое спасибо заранее,


Спасибо, ребята, за все ответы. Я удалил ведущую '0d 0a 0d 0a' ...

Вот что у меня есть софар:

#!/usr/bin/perl
use strict;
use warnings;

open(IN,"<test.txt");
open(OUT,">test.gif");

my @lines=<IN>;

foreach my $line (@lines){
        $line=~s/\n//g;
        my @bytes=split(/ /,$line);
        foreach my $byte (@bytes){
                print OUT $byte;
        }
}
close(OUT);
close(IN);

Ответы [ 4 ]

8 голосов
/ 20 июля 2011

Вы можете сделать это в оболочке, используя GNU echo:

$ /bin/echo -n -e "\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\xff\x00\xff\xff\xff\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x44\x01\x00\x3b" > foo.gif

$ identify foo.gif
foo.gif GIF 1x1 1x1+0+0 8-bit PseudoClass 2c 36B 0.000u 0:00.000

Вы также можете использовать команду xxd, которая будет "сделать hexdump или сделать наоборот ".Досадно, однако, что он кажется очень требовательным к формату ввода.Вот пример использования xxd:

$ cat > mygif.hex <<END
0000000: 4749 4638 3961 0100 0100 80ff 00ff ffff
0000010: 0000 002c 0000 0000 0100 0100 0002 0244
0000020: 0100 3b0a
END

$ xxd -r < mygif.hex > mygif.gif

gvim имеет интерфейс к xxd.Используйте пункт меню «Инструменты → Преобразовать в шестнадцатеричное» (клавиатура: :%!xxd), а затем «Инструменты → Преобразовать назад» (:%!xxd -r).

EMACS также имеет встроенный редактор шестнадцатеричных символов, которыйдоступ M-x hexl-mode (см. Редактирование двоичных файлов в руководстве).Это также немного раздражает, потому что вы должны набрать C-M-x (т.е. Ctrl-Meta-X) перед вводом символа с помощью его шестнадцатеричного кода:

EMACS hexl-mode

Конечно,очень просто написать простую C-программу для преобразования:

#include <stdio.h>

int main(int argc, char **argv) {
  unsigned int c;
  while (1 == scanf("%x", &c))
    putchar(c);
  return 0;
}

использование:

$ gcc -Wall unhexify.c -o unhexify
$ echo  "47 49 46 38 39 61 01 00 01 00 80 ff 
         00 ff ff ff 00 00 00 2c 00 00 00 00 
         01 00 01 00 00 02 02 44 01 00 3b" | ./unhexify > mygif.gif

Также: много ответов здесь в этом коде вопрос о гольфе .

5 голосов
/ 20 июля 2011
  • Открыть новый файл для записи (в двоичном режиме) с расширением .gif.
  • Прочитайте каждую пару шестнадцатеричных символов.
  • Преобразование шестнадцатеричного значения в байтовое (символьное) значение.
  • Запишите байт в открытый файл.
  • Когда закончите, закройте файл.

Если шестнадцатеричные данные представляют изображение GIF, файл должен содержать его.

3 голосов
/ 20 июля 2011
perl -ne'
   BEGIN { binmode STDOUT }
   s/\s//g;
   print pack "H*", $_;
' file.hex > file.gif

Perl 5.14:

perl -ne'
   BEGIN { binmode STDOUT }
   print pack "H*", s/\s//gr;
' file.hex > file.gif

(-n и print можно заменить на -p и $_ =, если вы хотите сыграть в гольф (сократите продолжительность программы.)

2 голосов
/ 20 июля 2011

Возможно, вы захотите прочитать документацию для unpack (или hex) и pack. Вы также можете найти документацию perlio полезной для создания необработанного дескриптора файла (поэтому perl не пытается помочь вам с такими вещами, как кодировки или окончания строк).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...