论坛: 编程破解 标题: 请教如何将一串16进制的数据流还原成字符????? 复制本贴地址    
作者: liuyit [liuyit]    论坛用户   登录
请教如何将一串16进制的数据流还原成字符?????
我用sniffer截获的一段16进制数据流,通过分析已知其为包含汉字和字母的字母的16进制形式,请问诸位:如何将其还原呢?
如果是纯粹的字母到好办,将其转换为Ascii码后,之后就可以还原了,可是中间有汉字,这怎么办?


地主 发表时间: 05-03-11 20:36

回复: 286 [unique]   版主   登录
1 把你的那串16进制串复制一下,粘贴到记事本里,假设句子是a.txt。
2 修改a.txt内容如下:
e 100 你的16进制串
n a.bin
r cx
1000
w
q

3 在DOS中输入debug<a.txt
4 type a.bin。


B1层 发表时间: 05-03-14 09:31

回复: liuyit [liuyit]   论坛用户   登录
非常感谢你的方法!!!!可以我是在写一个扫描器,需要以编程的方式来实现,这又怎么能行??

B2层 发表时间: 05-03-15 22:08

回复: 286 [unique]   版主   登录
晕,编程方式作这样的事是不是太简单了点?

char *ch={你的十六进制数};
printf("%s",ch);

B3层 发表时间: 05-03-16 09:10

回复: S_Admin [f_h]   论坛用户   登录
呵・

B4层 发表时间: 05-03-16 12:49

回复: liuyit [liuyit]   论坛用户   登录
两个字节表示一个汉字,解析纯汉字或字母这都不是问题,可以逐位解析(汉字以两个字节为单位,字母以一个字节为单位)我现在获得了一串16进制字符,里面混同有了汉字和字母,我需要将字符逐个解析出来,现在的主要问题是:我怎么知道16进制字符里哪个字节是字母,哪个字节又是汉字???

B5层 发表时间: 05-03-16 19:04

回复: 286 [unique]   版主   登录
彻底晕倒。。。。。。。。。。。。。。。

B6层 发表时间: 05-03-17 09:27

回复: 286 [unique]   版主   登录
算了,难得你是个技术问题。

你都得到这个字符了,想判断是不是字母,还不容易吗?
如果只是字母和汉字的组合。

if ((ch>'a'-1 && ch<'z'+1) || (ch>'A'-1 && ch<'Z'+1))  //||是“或”,&&是“并”
是字母

if (ch>127)
与后一个或前一个组成汉字

别再问我如果中间还有标点符号时怎么判断了。

B7层 发表时间: 05-03-17 09:35

回复: liuyit [liuyit]   论坛用户   登录
版主,不管你回答这个帖子时是如何的不屑,但我还是要感谢你。
但我要告诉你:
    char *ch={你的十六进制数};
    printf("%s",ch);
是不能通过编译的,如:
                char *ch={0x61};
                printf("%s",ch);是不能输出字母”a“的,编译器会报错
这样倒是能      char ch[]={0x61};
                printf("%s",ch);
但这种方式也输不出汉字,如:char ch[]={0xB0A1};
                            printf("%s",ch);是不能输出汉字---“啊”的!
不过我要感谢你的热情。
                说实话我不是第一天编程,你的关于ASCII码小于127,汉字内码每个字节大于127的结论,我恰巧今天上午在微机原理书上找到了。不过说实话,我现还是不能将内码输出为汉字,这个还要向你讨教,不慎感激!!!

B8层 发表时间: 05-03-17 22:09

回复: 286 [unique]   版主   登录
我都不知道该怎么回答你的问题了。说实在的,你真的应该去补一下你编程的基础知识。
从你的问话方式上来说,我真的认为你根本就没编过程序,因为最基本的常识你都不具备。
也许我上面的话太苛刻了点,不过我希望你能了解我一向是对事不对人的。

1 char *ch={0x61};printf("%s",ch);是不能输出字母”a“的,编译器会报错
这里的错误,不是一个说“说实话我不是第一天编程,”的人应该犯的错误,如果你对C不了解,这样说我可以理解,但从你能给61前面加上一个0x的角度上看,你还是知道C的。难道你就不知道C的字符串是以'0'作为结束的吗?我这里也只是象征性的告诉你方法,其中很多是“类某程序的语言描述”,有的时候甚至只告诉方法,而没程序,这要求你自己去分析,这也与我一贯不给人做作业的原则是一致的。
好了,说完你,我也应该自我批评一下。上面的说法本身就是有问题的。你可以采用的方法有:
char ch[]={...};
char *ch="\0x61\.....";
char ch[你的字符串长度+1]={.....};

2 char ch[]={0xB0A1};
错在,char的范围是-128~127。后面的值太大了。应改为char ch[3]={0xB0,0xA1,0};

3 汉字内码每个字节大于127的结论,
这是GB2312的编码方式,此间还出现过几种方式,但都不太流行,只在部分编码方式中出现过。比如有:前一个>127,后一个可小于127。甚至出现过三字节表示一个汉字的编码。
GB2312这种方式有一个缺点,就是字符串中无法定位一个汉字,所以早期的WPS等曾出现过“半个汉字”的现象。解决办法就是从字符串的头一个个找下去,其间还要注意字符和半角符号。




B9层 发表时间: 05-03-18 09:18

回复: liuyit [liuyit]   论坛用户   登录
我不想为我的“不知”而开脱,知之为知之,不知为不知,看样子版主不愧为版主。
以后我有问题就会跑过来问版主了。

B10层 发表时间: 05-03-19 08:43

回复: liuyit [liuyit]   论坛用户   登录
char *ch="\0x61\.....";    is wrong!!!!!!!
The right way is -----char *ch="\x61\.....";  //用转定义符表示应是\x61而不是\0x61!!!!

B11层 发表时间: 05-03-19 19:17

回复: lida1818 [lida1818]   论坛用户   登录
哈哈,楼主顶牛倒是一把好手^_^.


B12层 发表时间: 05-03-21 14:36

回复: lida1818 [lida1818]   论坛用户   登录
GB2312-80的编码的约定我记忆中是大于0xa0吧?第一个字节减去0xa0得汉字区码,第二个字节减去0xa0得位码

B13层 发表时间: 05-03-21 14:49

回复: wf88812 [wf88812]   论坛用户   登录
奉劝楼主还是先找两本关于unicode的书看看。

B14层 发表时间: 05-03-26 18:28

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号