【问题标题】:Convert Binary File To String In Perl在 Perl 中将二进制文件转换为字符串
【发布时间】:2015-05-23 18:05:42
【问题描述】:

好的。在过去的 14 个小时里,我一直在试图解决这个问题。我有一个包含以下内容的二进制文件 - (更多,但这是截断版本)。我希望将其转换为可读的字符串格式。

^@^P^@^@^A^@^@И^@^@^A^@^@Κ^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@^@^@^F^@^@^@^@^@^@^C^@FQ]U :^@^M^@ ^B^@^E^@^@^@`ESC^B^@d^@^@^@^T^R^B^@^E^@^@^@^@^@^@^@^ T^R^B^@^@^@^@^@^@^@^@^@^K^B^@^@^@^@^@^C^@HQ]U:^@^S^ @^@^@(^@^@^@V^@^@2^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@HQ]U:^@^V^@I^B ^@^E^@^@^@O^B^@ ^@^@^@O^B^@^E^@^@^@^@^@^@^@O^B^@^@^@^@^@^@^@^@^@^RK ^B^@^@^@^@^@^C^@HQ]U:^@^Y^@0^A^@d^@^@^@1^A^@^@^@ ^@L0^A^@d^@^@^@^@^@^@ ^@71^A^@^@^@^@^@^@^@^@^@0^A^@^@^@^@^@^C^@=Q]U:^@"^@ T^@^@2^@^@^@CN^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@^@^@^AT^@^@ ^@^@^@^@^C^@FQ]U:^@(^@$^M^A^@ ^@^@^@^G^A^@2^@^@^@^O^ A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@R^L^A^@ ^@^@^@^@^C^@=Q]U:^@.^@^B ^@^@^G^@^@g^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^B^@^@^@^@^@^@^C^@HQ]U:^@ 4^@^CH^@^@^Y^@^@^@G^@^@d^@^@^@ H^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^CH^@^ @^@^@^@^@^C^@HQ]U:^@O^@^M^@^@^@^@^@^G^M^@^@^A^@^ @^P^N^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@^@^M^@^@^@^@^@^@^C^@HQ]U:^@R^ @^B^@^@^A^@^@^B^@^@0^B^@^B^@^@^A^@^@^@^@^@^@^B^ @^@^@^@^@^@^@^@^@^@^B^@^@^@^@^@^@^C^@HQ]U:^@d^@F^A^ @ ^@^@^@^TJ^A^@ ^@^@^@M^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@G^A^@^@^@^@^@^C^@HQ]U:^@y^@j;^@^@^A^@^@^@=;^ @^@d^@^@^@(^@&^@^@^A^@^@^@&^@^@d ^@^@^@'^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @&^@^@ ^@^@^@^@^C^@FQ]U:^@^@^H^@^@^@^@^@^H^@^@d^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^H^@^@ ^@^@^@^@^C^@HQ]U:^@^@w^@^@^A^@^@^@\^@^@^A^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@Z^@^@^@ ^@^@^@^C^@HQ]U:^@^@^A^B^@ ^@^@^@^A^B^@^A^@^@^@^A^@ ^@^@^@^@^@^@^@"^A^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@ ^C^@HQ]U:^@^@4I^@^@^A^@^@^@DH^@^@^A^@^@^@^]B^@^@^@ ^@^@^@^@^@^@I^@^@^@^@^@^@^@^@^@^@MI^@^@^@^@^@^@^C^@ FQ]U:^@^@y^@^@^A^@^@^@^Xy^@^@^A^@^@^@]a^@^@^C^@^@^@^ @^@^@^@Px^@^@^@^@^@^@^@^@^@^@wy^@^@^@^@^@^@^C^@HQ]U: ^@^@V^^@^@^T^@^@^@^^@^@^A^@^@^@ZU^@^@e^@^@^@^@^@^@^ @$^^@^@^@^@^@^@^@^@^@^@^^@^@^@^@^@^@^C^@DQ]U:^@^@DESC^ @^@^A^@^@XESC^@ ^@^A^@^@^@^\^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@ESC^@^@^@^@^@^@^C^@HQ]U:^@^@ESC^@^@2^@^@^@ESC ^@^@d^@^@^@ESC^@^@^@^@^@^@^@^@^@ESC^@^@^@^@^@^@^@^@^@^ @ESC^@^@^@^@^@^@^C^@HQ]U:^@^@-^A^@^@^@^@@-^A^@^A^@^@U^@^@^A^@^@@^@ ^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @ ^A^@^@^@^@^@^@^C^@FQ]U:^@^G^A^T^A^@ ^@^@^@Y^A^@Q^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@^@^P^A^@^@^@^@^@^C^@HQ]U:^@^S^A^^^B^@^A^@ ^@^@2^B^@ ^@^@^@^O^B^@n^@^@^@^@^@^@^@^^B^@^@^@^@^@^@^@^@ ^@^_^B^@^@^@^@^@^C^@DQ]U:^@^V^A4^A^@^@^@^@^P!^A^@K^@ ^@^@8D^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@* ^A^@^@^@^@^@^C^@?Q]U:^@.^Aw^F^@^@^A^@^@^@h^F^@^@^O^ @^@b^G^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ w^F^@^@^@^@^@^@^C^@HQ]U:^@1^A^A^@^A^@^@^@^A^@^\^B^@ ^@X^O^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ A^@^@^@^@^@^C^@HQ]U:^@4^A^X^F^@^@^G^@^@x^E^@^@^Z^D^ @^@@^F^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^X^F^@^@^@^@^@^@^C^@FQ]U:^@=^A^L^F^@^A^@^@^@\^F^@^G ^@^@^@X^F^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @S^F^@^@^@^@^@^C^@=Q]U:^@O^A^P!^A^@^@^@^@^@^@^@^@^ @^A^@^@^@^H^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@ "^A^@^@^@^@^@^C^@BQ]U:^@R^AX^@^@^Y^@^@^@^@^@^E^@^@^@ x^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^C^@HQ]U:^@U^A^R^Q^@^@^A^@^@^@^P^@^@2^@^@^@^ P^@^@^A^@^@^@^@^@^@^@^P^@^@^@^@^@^@^@^@^@^@^H^Q^@^ @^@^@^@^@^C^@@Q]U:^@^^An^A^@^A^@^@^@pM ^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@hn^A^@^@^@^@^@^C^@HQ]U:^@p^A^A^@^B^@^@^ @d^A^@^E^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@^@^@^R^A^@^@^@^@^@^C^@HQ]U:^@s^A^A^@^Y ^@^@^@ȩ^A^@^T^@^@^@а^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@ ^@^@^@y^A^@^@^@^@^@^C^@HQ]U:^@|^A^@^@^A^@^@M^ @^@d^@^@^@

我有这个文件的模板定义如下 -

标题 转码短 2 字节, 时间戳长 4 字节, 消息长度短 2 字节, (共 8 字节)

数据 安全令牌短 2 字节, 最后交易价格长 4 字节, 百思买数量长 4 字节, 百思买价格长 4 字节, 畅销数量长 4 字节, 最佳售价长 4 字节, 总交易量 Long 4 字节, 平均交易价格长 4 字节, 开盘价长 4 字节, 高价长 4 字节, 低价长 4 字节, 收盘价长 4 字节, 填充长 4 字节(空白), (共 50 字节)

我尝试了 perl 的打包,解包,ord,逐字节读取,摆脱那些“^@”并试图理解剩余的内容,似乎是十六进制代码,但我无法使这个可读通过 perl 在 ASCII 字符串中。我还尝试了原始、编码、解码,甚至彻底搜索了 stackoverflow。在同一个联盟中几乎没有问题,但这些人都没有共享模板来解码它。我有,但还是想不通。

我缺少一些基本但无法真正指出的东西。如果有人能用代码一步一步地向我展示应该如何完成这种转换,我将不胜感激。

以前从来没有这样做过......

$ xxd 1.bin
0000000: 0300 3b51 5d55 3a00 0700 f87f 0000 0100  ..;Q]U:.........
0000010: 0000 587f 0000 0100 0000 6b67 0000 0100  ..X.......kg....
0000020: 0000 0000 0000 587f 0000 0000 0000 0000  ......X.........
0000030: 0000 e880 0000 0000 0000 0300 4851 5d55  ............HQ]U
0000040: 3a00 0a00 109a 0000 f401 0000 d098 0000  :...............
0000050: f401 0000 ce9a 0000 0000 0000 0000 0000  ................
0000060: 0000 0000 0000 0000 0000 0000 069a 0000  ................
0000070: 0000 0000 0300 4651 5d55 3a00 0d00 a80a  ......FQ]U:.....
0000080: 0200 0500 0000 601b 0200 6400 0000 1412  ......`...d.....
0000090: 0200 0500 0000 0000 0000 1412 0200 0000  ................
00000a0: 0000 0000 0000 ac0b 0200 0000 0000 0300  ................
00000b0: 4851 5d55 3a00 1300 f8f2 0000 2800 0000  HQ]U:.......(...
00000c0: 56c2 0000 3200 0000 fbf9 0000 0000 0000  V...2...........
00000d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000e0: a3f2 0000 0000 0000 0300 4851 5d55 3a00  ..........HQ]U:.
00000f0: 1600 8c49 0200 0500 0000 cc4f 0200 0a00  ...I.......O....
0000100: 0000 cc4f 0200 0500 0000 0000 0000 cc4f  ...O...........O
0000110: 0200 0000 0000 0000 0000 124b 0200 0000  ...........K....

仍然没有多大意义。

【问题讨论】:

  • 把你的努力放在这里,让我们看看哪里出了问题。
  • 你从哪里得到的显示?以十六进制显示二进制内容更有用
  • 好的。我只是愚蠢地做了一只猫......你怎么看十六进制的二进制内容? xxd ...我明白了..

标签: perl binary hex ascii


【解决方案1】:

我看到的最大问题是解包二进制数据不仅仅是知道“短”或“长”。

对于数值,您需要指定字节数据是小端还是大端。您还需要知道您处理的是有符号值还是无符号值。

对于这个例子,我只是假设一切都是小端和无符号的:这可能是错误的,但是一旦你发现它就由你来调整包模板。如果您需要链接,请尝试http://perldoc.perl.org/functions/pack.html

我还没有在我的机器上测试过这个,如果有任何错误请见谅,但这大致就是我会如何去做你想做的事情。

#!/usr/bin/perl
use strict;

$/ = undef; #may not be necessary, I haven't tested this
open IN, "path/to/file.ext"; #open the file for reading

read(IN,my $raw_header, 8); #read 8 bytes off of the file into $raw_header

my @header = unpack("vVv", $raw_header); #unpack header into array

read(IN,my $raw_data, 50); #similar

my @data = unpack("vVVVVVVVVVVVV", $raw_data); #"vV12" is also acceptable, assuming everything is little endian and unsigned

print join "\n", @header, @data; #print all the values in order on their own lines.

【讨论】:

  • 是的......我想长短并不是一个大问题,因为模板清楚地指定了它。签名/未签名他们懒得提...无论如何...让我试试你的解决方案。
  • 好的。这确实给了我一个输出 - $ ./sug1.pl 3 1432179003 58 所以这是有道理的。你得到了标题......我猜时间戳是unix数字,它转换为纪元(05/21/2015 @ 3:30am(UTC))并且消息长度是offcourse header + data = 58。但我仍然没有得到实际数据的任何输出......让我调整一些东西看看......
  • 哎呀!我在第二个解包语句中打错了字,忘记指定我要解包的内容!再试一次。
  • 没有。我已经注意到了,但它没有正确的意义......./sug1.pl 3 1432179003 58 7 32760 1 32600 1 26475 1 0 32600 0 0 33000 0
  • 在没有看到任何有关数据集的进一步文档的情况下,我真正可以建议的是尝试不同类型的解包字符用于短裤和长期。 “n”和“N”是大端字节序的。您也可以尝试使用“s”和“l”来表示短裤和多头。通过简单地弄乱不同的代码并查看发生了什么,我学到了我所知道的关于字节解包的大部分知识。无论如何,祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2010-11-10
  • 2014-11-07
  • 2021-02-24
  • 1970-01-01
相关资源
最近更新 更多