如何从以下十六进制流创建 .gif 文件:
0d 0a 0d 0a 47 49 46 38 39 61 01 00 01 00 80 ff 00 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);
最佳答案
您可以在 shell 中执行此操作,使用 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
的接口(interface)。使用“工具 → 转换为十六进制”菜单选项(键盘::%!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
关于c++ - 将十六进制流转换为 GIF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6765092/