免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4809 | 回复: 18
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-14 18:51 |只看该作者 |倒序浏览
用记事本等软件在简体XP下可直接显示汉字,但不知道应如何提取它们。

随便看了几个,开头结尾都有00h,但最好不依赖这个规律。考虑双字节就都了吧。

论坛徽章:
0
2 [报告]
发表于 2008-07-14 19:55 |只看该作者
弄个样本上来看看?

论坛徽章:
0
3 [报告]
发表于 2008-07-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
4 [报告]
发表于 2008-07-15 20:40 |只看该作者
已帖样品。
谢谢先。

论坛徽章:
0
5 [报告]
发表于 2008-07-15 23:06 |只看该作者
#!/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];
}
   

今天没时间了,明天继续做

论坛徽章:
0
6 [报告]
发表于 2008-07-16 00:45 |只看该作者
感觉上面这是显示时GUI干的活。
——————————————————————————————
我想的是for (my $i=0; $i<$#data+1; $i++),文件指针为$i,每次读两个字节,在汉字范围内计数器加一,超过连续n(比如n=3)个汉字就认为是汉字串,把起始偏移量,长度,字串本身打印一行,再接着处理后面的。

最好能把判断写灵活些,双字节的各种编码直接指定范围就能调用。

论坛徽章:
0
7 [报告]
发表于 2008-07-16 09:06 |只看该作者
可以直接&0x80来判断是否是中文字符

论坛徽章:
0
8 [报告]
发表于 2008-07-16 16:50 |只看该作者
原帖由 Rush_2008 于 2008-7-16 09:06 发表
可以直接&0x80来判断是否是中文字符

对二进制文件,肯定不能仅仅用高位为1判断
对纯ANSI英语加GB码的才能这样。
连iso-8859-1都有超过7f的字符。

论坛徽章:
0
9 [报告]
发表于 2008-07-17 23:50 |只看该作者
cobrawgl ,帮忙写个例子吧,自己不知道怎么写看起来简洁。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2008-07-18 09:04 |只看该作者
man strings
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP