免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: galaxy001
打印 上一主题 下一主题

[求助]如何提取二进制文件中的GB2312字符串? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2008-07-18 09:31 |只看该作者
其实吧,我觉得,这个问题主要是要求你对游戏的 DATA 文件格式有一定的了解。

论坛徽章:
0
12 [报告]
发表于 2008-07-18 14:58 |只看该作者
原帖由 flw 于 2008-7-18 09:04 发表
man strings

strings 是针对英文的,objdump也没提供直接的GB2312支持。
我想要个比较通用的查看方法,只要原文件没加密没压缩,就能提出文本阅读。
至于针对每类文件解析,暂时不考虑。

论坛徽章:
0
13 [报告]
发表于 2008-07-18 22:43 |只看该作者
比如说,看到这样的文件,人可以直接根据连续多个汉字来读取出嵌在里面的文本,并不需要了解具体结构。
我想要的就是把连续n个在汉字范围内的字符串提取出来,便于阅读。

原帖由 galaxy001 于 2008-7-14 20:23 发表
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   04 00 00 00 00 00 00 00  A8 0C 00 00 B0 14 00 00   ........?..?..
00000010   7C 1A 00 00 9F 86 01 00  00 00 00 00 13 00 00 00   |...焼..........
00000020   08 00 00 00 35 00 00 00  06 00 00 00 25 00 00 00   ....5.......%...
00000030   34 00 00 00 1A 00 00 00  2E 00 00 00 D6 D5 D3 DA   4...........终于
00000040   B8 E6 D2 BB B6 CE C2 E4  C1 CB B0 A1 A1 A3 CB B5   告一段落了啊。说
00000050   C6 F0 C0 B4 CB FD D2 B2  B2 EE B2 BB B6 E0 B8 C3   起来她也差不多该
00000060   C0 B4 C1 CB B0 C9 A1 AD  A1 AD 00 00 FF FF FF FF   来了吧……..
00000070   FF FF FF FF FF FF FF FF  FF FF FF FF 1A 00 00 00   ....
00000080   38 00 00 00 B5 AB CA C7  A1 A2 BA C3 BA C3 CF EB   8...但是、好好想
00000090   D2 BB CF C2 B5 C4 BB B0  A3 AC C4 C7 CC EC D2 D4   一下的话,那天以
000000A0   BA F3 BD F1 CC EC CA C7  B5 DA D2 BB B4 CE BA C3   后今天是第一次好
000000B0   BA C3 B5 D8 BC FB C3 E6  B0 A1 A1 A3 00 00 00 00   好地见面啊。....
000000C0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   
000000D0   1A 00 00 00 34 00 00 00  D0 A1 D0 F1 A1 A2 BB E1   ....4...小旭、会
000000E0   B9 FD C0 B4 C2 F0 A3 BF  B6 D4 D0 A1 D0 F1 B5 C4   过来吗?对小旭的
000000F0   D0 D4 B8 F1 C0 B4 CB B5  CA C7 B1 C8 BD CF C0 A7   性格来说是比较困
00000100   C4 D1 B5 C4 CA C2 B0 C9  A1 AD A1 AD 00 00 00 00   难的事吧……....
00000110   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   
00000120   1A 00 00 00 06 00 00 00  DF C0 A1 AD A1 AD 00 00   ........呃……..
00000130   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   
00000140   36 00 00 00 35 00 00 00  13 00 00 00 22 00 00 00   6...5......."...
00000150   06 00 00 00 05 00 00 00  1F 00 00 00 06 00 00 00   ................
00000160   03 00 00 00 33 00 00 00  06 00 00 00 1A 00 00 00   ....3...........
00000170   10 00 00 00 A1 B8 CE E7  A1 A2 CE E7 A1 A2 CE E7   ....「午、午、午
00000180   B0 B2 A1 B9 00 00 00 00  FF FF FF FF 00 00 00 00   安」........
00000190   FF FF FF FF FF FF FF FF  33 00 00 00 00 00 00 00   3.......
000001A0   1A 00 00 00 0C 00 00 00  A1 B8 D0 A1 D0 F1 A1 AD   ........「小旭…

论坛徽章:
0
14 [报告]
发表于 2008-07-19 15:17 |只看该作者
#! /usr/bin/env perl

use strict;
use warnings;

# GB2312 其编码范围是高位0xa1-0xfe,低位也是0xa1-0xfe;汉字从0xb0a1开始,结束于0xf7fe。
# GB2312的汉字编码规则为:第一个字节的值在0xB0到0xF7之间,第二个字节的值在0xA0到0xFE之间。


while (<DATA>) {
        my @t = (split)[1 .. 16];
       
        while (@t) {
                my $t1 = shift @t;

                if (in_range($t1)) {
                        my $t2 = shift @t;
                        if (in_range($t2)) {
                                printf "%c%c", hex $t1, hex $t2;
                                next;
                        } else {
                                unshift @t, $t2;
                        }
                }
        }
}

sub in_range {
        $_ = shift;
        return (hex $_ >= 0xa1)&&(hex $_ <= 0xfe);
}

__DATA__
00000000   04 00 00 00 00 00 00 00  A8 0C 00 00 B0 14 00 00   ........?..?..
00000010   7C 1A 00 00 9F 86 01 00  00 00 00 00 13 00 00 00   |...焼..........
00000020   08 00 00 00 35 00 00 00  06 00 00 00 25 00 00 00   ....5.......%...
00000030   34 00 00 00 1A 00 00 00  2E 00 00 00 D6 D5 D3 DA   4...........终于
00000040   B8 E6 D2 BB B6 CE C2 E4  C1 CB B0 A1 A1 A3 CB B5   告一段落了啊。说
00000050   C6 F0 C0 B4 CB FD D2 B2  B2 EE B2 BB B6 E0 B8 C3   起来她也差不多该
00000060   C0 B4 C1 CB B0 C9 A1 AD  A1 AD 00 00 FF FF FF FF   来了吧……..

论坛徽章:
0
15 [报告]
发表于 2008-07-19 21:54 |只看该作者
能写个同时考虑两个字节,且两个字节范围不同的方案吗?
貌似会复杂不少。

论坛徽章:
0
16 [报告]
发表于 2008-07-19 22:10 |只看该作者
原帖由 galaxy001 于 2008-7-19 21:54 发表
能写个同时考虑两个字节,且两个字节范围不同的方案吗?
貌似会复杂不少。




什嘛意思?

论坛徽章:
0
17 [报告]
发表于 2008-07-20 14:22 |只看该作者
sub in_range {
        $_ = shift;
        return (hex $_ >= 0xa1)&&(hex $_ <= 0xfe);
}
这不是假设两个字节都是 a1h~feh 吗?

第一个字节的值在0xB0到0xF7之间,第二个字节的值在0xA0到0xFE之间。
这要怎么写代码?

论坛徽章:
0
18 [报告]
发表于 2008-07-20 15:48 |只看该作者
原帖由 galaxy001 于 2008-7-20 14:22 发表
sub in_range {
        $_ = shift;
        return (hex $_ >= 0xa1)&&(hex $_  


这样的话,标点符号就没有了


#! /usr/bin/env perl

use strict;
use warnings;

# GB2312 其编码范围是高位0xa1-0xfe,低位也是0xa1-0xfe;汉字从0xb0a1开始,结束于0xf7fe。
# GB2312的汉字编码规则为:第一个字节的值在0xB0到0xF7之间,第二个字节的值在0xA0到0xFE之间。


while (<DATA>) {
        my @t = (split)[1 .. 16];
       
        while (@t) {
                my $t1 = shift @t;

                if (in_range1($t1)) {
                        my $t2 = shift @t;
                        if (in_range2($t1.$t2)) {
                                printf "%c%c", hex $t1, hex $t2;
                        }
                }
        }
}

sub in_range1 {
        $_ = shift;
        return (hex $_ >= 0xa1)&&(hex $_ <= 0xfe);
}

sub in_range2 {
        $_ = shift;
        return (hex $_ >= 0xb0a1)&&(hex $_ <= 0xf7fe);
}

__DATA__
00000000   04 00 00 00 00 00 00 00  A8 0C 00 00 B0 14 00 00   ........?..?..
00000010   7C 1A 00 00 9F 86 01 00  00 00 00 00 13 00 00 00   |...焼..........
00000020   08 00 00 00 35 00 00 00  06 00 00 00 25 00 00 00   ....5.......%...
00000030   34 00 00 00 1A 00 00 00  2E 00 00 00 D6 D5 D3 DA   4...........终于
00000040   B8 E6 D2 BB B6 CE C2 E4  C1 CB B0 A1 A1 A3 CB B5   告一段落了啊。说
00000050   C6 F0 C0 B4 CB FD D2 B2  B2 EE B2 BB B6 E0 B8 C3   起来她也差不多该
00000060   C0 B4 C1 CB B0 C9 A1 AD  A1 AD 00 00 FF FF FF FF   来了吧……..

论坛徽章:
0
19 [报告]
发表于 2008-07-20 17:08 |只看该作者
要判断半角标点,只要在外层if上加elsif就可以了。

才发现是按“ 04 00 00 00 00 00 00 00  A8 0C 00 00 B0 14 00 00 ”来处理的。
如果我要直接处理源二进制文件,还得把shift改read,……

先问下,对 char类型的变量比较大小,Perl和C的行为是一致的吧?

最初,我以为要判断2个字节就要一次读两个字节,所以想到的代码怎么看怎么别扭。
没想到用简单的if嵌套处理,让大家见笑了,……

[ 本帖最后由 galaxy001 于 2008-7-20 17:49 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP