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

其实吧,我觉得,这个问题主要是要求你对游戏的 DATA 文件格式有一定的了解。


QUOTE:
原帖由 flw 于 2008-7-18 09:04 发表
man strings

strings 是针对英文的,objdump也没提供直接的GB2312支持。
我想要个比较通用的查看方法,只要原文件没加密没压缩,就能提出文本阅读。
至于针对每类文件解析,暂时不考虑。
比如说,看到这样的文件,人可以直接根据连续多个汉字来读取出嵌在里面的文本,并不需要了解具体结构。
我想要的就是把连续n个在汉字范围内的字符串提取出来,便于阅读。

QUOTE:
原帖由 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   ........「小旭…

能写个同时考虑两个字节,且两个字节范围不同的方案吗?
貌似会复杂不少。


QUOTE:
原帖由 galaxy001 于 2008-7-19 21:54 发表
能写个同时考虑两个字节,且两个字节范围不同的方案吗?
貌似会复杂不少。



什嘛意思?
sub in_range {
        $_ = shift;
        return (hex $_ >= 0xa1)&&(hex $_ <= 0xfe);
}
这不是假设两个字节都是 a1h~feh 吗?

第一个字节的值在0xB0到0xF7之间,第二个字节的值在0xA0到0xFE之间。
这要怎么写代码?
要判断半角标点,只要在外层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嵌套处理,让大家见笑了,……