将十六进制流转换为 GIF

发布于 2024-11-25 20:32:51 字数 822 浏览 1 评论 0原文

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

How do I create a .gif file from the following HEX stream:

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 is the GIF file terminator

I'm trying to do it following the guide at http://en.wikipedia.org/wiki/Graphics_Interchange_Format#Example_GIF_file

I'd like to implement this in either Perl or C/C++. Any language will do though.

Many thanks in advance,


Thanks guys for all the replies. I removed the leading '0d 0a 0d 0a'...

Here's what I have sofar:

#!/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);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

马蹄踏│碎落叶 2024-12-02 20:32:51

您可以在 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 命令将“进行十六进制转储或执行相反的操作” 。然而,令人烦恼的是,它似乎对输入格式非常挑剔。下面是一个使用 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 还有一个内置的十六进制编辑器,可通过 Mx hexl-mode 访问(请参阅 编辑二进制文件(手册中)。这也有点烦人,因为在按十六进制代码输入字符之前,您必须输入 CMx (即 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

另外: 此代码高尔夫问题中有许多答案

You can do it in the shell, using 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

You can also use the xxd command which will "make a hexdump or do the reverse". Annoyingly, however, it seems very picky about the input format. Here's an example using 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 has an interface to xxd. Use the "Tools → Convert To Hex" menu option (keyboard: :%!xxd) and then "Tools → Convert Back" (:%!xxd -r).

EMACS also has a built-in hex editor, which is accessed by M-x hexl-mode (see Editing Binary Files in the manual). It's also a little bit annoying, because you have to type C-M-x (i.e. Ctrl-Meta-X) before entering a character by its hex code:

EMACS hexl-mode

Of course, it is very easy to write a simple C program to do the conversion:

#include <stdio.h>

int main(int argc, char **argv) {
  unsigned int c;
  while (1 == scanf("%x", &c))
    putchar(c);
  return 0;
}

usage:

$ 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

Also: many answers here in this code golf question.

勿忘心安 2024-12-02 20:32:51
  • 打开一个新文件进行写入(以二进制模式),扩展名为 .gif
  • 读取每对十六进制字符。
  • 将十六进制转换为字节 (char) 值。
  • 将字节写入打开的文件。
  • 完成后,关闭文件。

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

  • Open a new file for writing (in binary mode) with the .gif extension.
  • Read each pair of hex characters.
  • Convert the hex to a byte (char) value.
  • Write the byte to the opened file.
  • When finished, close the file.

If the hex data represents a GIF image, the file should contain it.

走过海棠暮 2024-12-02 20:32:51
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$_ =高尔夫(缩短节目长度。)

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 and print can be replaced with -p and $_ = if you want to golf (shorten the length of the program.)

柒七 2024-12-02 20:32:51

您可能需要阅读 unpack (或 < a href="http://perldoc.perl.org/functions/hex.html" rel="nofollow">hex) 和 pack。您还可能会发现 perlio 文档对于创建原始文件句柄很有用(所以 perl 不会尝试帮助您处理诸如编码或行结尾之类的事情)。

You may want to read the documentation for unpack (or hex) and pack. You may also find the perlio documentation useful for creating a raw file handle (so perl doesn't try to help you with things like encodings or line endings).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文