c++ - 将十六进制流转换为 GIF

标签 c++ c perl hex gif

如何从以下十六进制流创建 .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):

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 .

关于c++ - 将十六进制流转换为 GIF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6765092/

相关文章:

c - 具有停止条件但没有基本情况的递归函数仍然有效

c - 在 C 中将值发送到声音驱动程序(const void)

regex - .* 是什么?正则表达式实际上是什么意思?

c++ - C++ 标准是否强制局部变量的引用捕获效率低下?

c++ - 线程内存问题(tinythread,C++)

c - C语言链表中的节点

perl - 当 Perl 中发生不好的事情时,是 croak() 还是 die() 更好?

c++ - 函数模板 : default type parameter

c++ - 获取最近的路径图

珀尔 : change array item that is hashed to a key