将十六进制流转换为GIF

Eam*_*orr 3 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);
Run Code Online (Sandbox Code Playgroud)

nib*_*bot 8

您可以使用GNUecho在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
Run Code Online (Sandbox Code Playgroud)

您还可以使用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
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

用法:

$ 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
Run Code Online (Sandbox Code Playgroud)

另外:这个代码高尔夫问题的答案很多.


Jon*_*ler 5

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

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