如何从以下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);
答案 0 :(得分:8)
您可以使用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
访问(参见手册中的Editing Binary Files)。它也有点烦人,因为在输入字符的十六进制代码之前你必须输入C-M-x
(即Ctrl-Meta-X):
当然,编写一个简单的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
答案 1 :(得分:5)
.gif
扩展名打开一个新文件(二进制模式)。如果十六进制数据表示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
(-n
和print
可以替换为-p
和$_ =
,如果您想打高尔夫球(缩短程序的长度)。
答案 3 :(得分:2)