|
![]() | 作者: 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号