将十六进制流转换为GIF

时间:2011-07-20 16:15:51

标签: c++ c perl hex gif

如何从以下HEX流创建.gif文件:

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 个答案:

答案 0 :(得分:8)

您可以使用GNU echo

在shell中执行此操作
$ /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访问(参见手册中的Editing Binary Files)。它也有点烦人,因为在输入字符的十六进制代码之前你必须输入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

另外:many answers here in this code golf question

答案 1 :(得分:5)

  • 使用.gif扩展名打开一个新文件(二进制模式)。
  • 读取每对十六进制字符。
  • 将十六进制转换为字节(char)值。
  • 将字节写入打开的文件。
  • 完成后,关闭文件。

如果十六进制数据表示GIF图像,则该文件应包含它。

答案 2 :(得分:3)

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

-nprint可以替换为-p$_ =,如果您想打高尔夫球(缩短程序的长度)。

答案 3 :(得分:2)

您可能需要阅读unpack(或hex)和pack的文档。您可能还会发现perlio文档对于创建原始文件句柄很有用(因此perl不会尝试帮助您处理编码或行结尾等内容。)