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

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

用记事本等软件在简体XP下可直接显示汉字,但不知道应如何提取它们。

随便看了几个,开头结尾都有00h,但最好不依赖这个规律。考虑双字节就都了吧。
弄个样本上来看看?
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   ........「小旭…
已帖样品。
谢谢先。
#!/usr/bin/perl

use strict;
use warnings;

#
# gb2312 => 0xa1-0xfe
# 汉字从0xb0a1开始,结束于0xf7fe
#

my $data = 'D0 D4 B8 F1 C0 B4 CB B5 CA C7 B1 C8 BD CF C0 A7';
my $string = '性格来说是比较困';

my @data = split / /, $data;

for (my $i=0; $i<$#data+1; $i+=2) {
        printf "%c%c", hex $data[$i], hex $data[$i+1];
}
   

今天没时间了,明天继续做
感觉上面这是显示时GUI干的活。
——————————————————————————————
我想的是for (my $i=0; $i<$#data+1; $i++),文件指针为$i,每次读两个字节,在汉字范围内计数器加一,超过连续n(比如n=3)个汉字就认为是汉字串,把起始偏移量,长度,字串本身打印一行,再接着处理后面的。

最好能把判断写灵活些,双字节的各种编码直接指定范围就能调用。
可以直接&0x80来判断是否是中文字符


QUOTE:
原帖由 Rush_2008 于 2008-7-16 09:06 发表
可以直接&0x80来判断是否是中文字符

对二进制文件,肯定不能仅仅用高位为1判断
对纯ANSI英语加GB码的才能这样。
连iso-8859-1都有超过7f的字符。
cobrawgl ,帮忙写个例子吧,自己不知道怎么写看起来简洁。
man strings