|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
那做企业软件是不是最好用J2EE?QQ的体系心情,自定心情和截图都是间接夹杂在笔墨信息中间接发送过去的,假如在吸收到时不加转换,间接显现,会形成乱码。因而我们要把这些信息转化下再显现。
关于这些心情,自界说心情和截图的申明以下:来历LumaQQ的代码注解
*<pre>
*一般动静的本体,其在NormalIMHeader以后
*
*一般动静中大概内嵌一些图片信息,除一般的文本以外,图片的信息格局为:
*一.缺省心情,缺省心情的前导字节是0x14,0x14以后的一个字节暗示缺省心情的索引值
*二.自界说心情,自界说心情的前导字节是0x15,0x15以后的格局为:
*1.存在性字节,假如这个心情第一次呈现,则为0x33,假如已呈现过,则为0x34,当为0x33时,前面的内容是
*i.扩大名长度,1字节,以"0"为基准,"2"则暗示长度为3
*ii.心情图片的文件名,其文件名由md5的字符串情势和扩大名组成,因而这个长度应当是32+1+3(通常为GIF)
*iii.心情的shortcut长度,以"A"为基准,假如长度是2,则这个字节是"C"
*iv.心情的shortcut
*2.假如为0x34时,则前面的内容为:
*i.1字节索引值,假设这个自界说心情呈现在第一个地位,则这个字节为"A"
*3.假如为0x36时,群内自界说心情
*i.自界说心情协定块的长度的10进制字符串情势,3字节,不敷者前部填为空格,好比为了暗示这个自界说心情用了
*88个字节,那末这个字段就是"88",呵呵,晕吧,注重这个长度是从0x15入手下手算起,一向到停止。注重这个长度
*是字节长度
*ii.心情标识,1字节,标识这个心情是新的,仍是已呈现过的,假如是新的自界说心情,用"e"暗示;假如是截图,用"k"暗示。假如是已呈现过的,
*用一个年夜写字母暗示,第一个新心情代号是A,第二个是B,以此类推
*iii.心情的快速键字节长度,1字节,用一个年夜写字母暗示,好比A暗示长度为0,顺次类推
*iv.前面的内容入手下手一向到agentkey之前的内容的长度,2字节,用16进制的字符串暗示
*v.sessionid的16进制字符串情势,8字节,不敷者后面是空格
*vi.直达服务器IP的16进制字符串情势,注重是little-endian,那末ipv4的话天然就是8个字节了
*vii.直达服务器端标语的16进制字符串情势,8个字节
*viii.fileagentkey,16字节
*ix.图片的文件名,文件名的情势是MD5的字符串情势加上点加上后缀名而成,以是通常为36个字节,可是
*我想最好仍是依据后面的长度减往其他字段的长度来判别好些
*x.快速键,长度后面已说了
*xi.一个字节,"A",多是用来分界用的
*4.假如为0x37时,群内自界说心情
*0x37暗示这个心情已在后面呈现过,拜见0x36时的格局,0x37短少0x36的iv,v,vii,viii,ix部分,
*其他部分均不异
*</pre>
代码以下:- privatestringAnalyCustomFace(byte[]IMBytes){ArrayListal=newArrayList();List<string>Faces=newList<string>();byte[]tempBytes;intbytesSize=0;intshortcutSize=0;boolFaceOrPic=true;//true是自界说心情,false是截屏stringFaceName="";byte[]FaceNameBytes;byte[]facebytes;al.AddRange(IMBytes);for(inti=0;i<al.Count-1;i++){if((FaceType)al[i]==FaceType.DEFAULT&&(byte)al[i+1]>=0x40&&(byte)al[i+1]<=0xC7)//QQ的心情标记是0x14开首的,下一字节暗示心情索引号。0x15开首的是自界说心情。这里处置体系心情,以避免乱码。{stringface=string.Format("<imgsrc="face/{0}.gif"/>",al[i+1].ToString());facebytes=Encoding.GetEncoding("GBK").GetBytes(face);al.RemoveRange(i,2);al.InsertRange(i,facebytes);i+=facebytes.Length-1;continue;}if((FaceType)al[i]==FaceType.CUSTOM&&(FaceType)al[i+1]==FaceType.NEW_SERVER_SIDE_CUSTOM)//这里转换自界说心情和贴图FaceType.CUSTOM暗示是自界说心情或贴图,FaceType.NEW_SERVER_SIDE_CUSTOM暗示是在这条动静里第一次呈现的自界说心情或贴图{tempBytes=newbyte[3];//这里猎取心情数据的长度al.CopyTo(i+2,tempBytes,0,3);bytesSize=Convert.ToInt32(Encoding.GetEncoding("GBK").GetString(tempBytes));tempBytes=newbyte[bytesSize];al.CopyTo(i,tempBytes,0,bytesSize);if(tempBytes[5]==0x65)//假如是"e"暗示是自界说心情{FaceOrPic=true;}elseif(tempBytes[5]==0x6B)//假如是"k"暗示是贴图自界说心情和贴图的区分在于文件名分歧,自界说心情的文件名是MD5字串加扩大名,贴图是{GUID}加扩大名{FaceOrPic=false;}shortcutSize=(int)(tempBytes[6]-0x41);//快速键长度if(FaceOrPic){FaceNameBytes=newbyte[36];//MD5+".gif"一共36个字节Array.Copy(tempBytes,0x31,FaceNameBytes,0,36);FaceName=Encoding.GetEncoding("GBK").GetString(FaceNameBytes);stringface=string.Format("[CustomFace={0}]",FaceName);facebytes=Encoding.GetEncoding("GBK").GetBytes(face);al.RemoveRange(i,bytesSize);//删除原数据al.InsertRange(i,facebytes);//拔出本人转换后的数据}else{FaceNameBytes=newbyte[42];//{GUID}+".gif"一共42个字节Array.Copy(tempBytes,0x31,FaceNameBytes,0,42);FaceName=Encoding.GetEncoding("GBK").GetString(FaceNameBytes).Replace("{","").Replace("}","");stringface=string.Format("[CustomFace={0}]",FaceName);facebytes=Encoding.GetEncoding("GBK").GetBytes(face);al.RemoveRange(i,bytesSize);al.InsertRange(i,facebytes);}Faces.Add(FaceName);//到场行列}elseif((FaceType)al[i]==FaceType.CUSTOM&&(FaceType)al[i+1]==FaceType.EXISTING_SERVER_SIDE_CUSTOM_SIDE)//假如是本动静中已呈现过的心情或截图{tempBytes=newbyte[3];al.CopyTo(i+2,tempBytes,0,3);bytesSize=Convert.ToInt32(Encoding.GetEncoding("GBK").GetString(tempBytes));tempBytes=newbyte[bytesSize];al.CopyTo(i,tempBytes,0,bytesSize);FaceName=Faces[tempBytes[5]-0x41];//从行列中掏出stringface=string.Format("[CustomFace={0}]",FaceName);facebytes=Encoding.GetEncoding("GBK").GetBytes(face);al.RemoveRange(i,bytesSize);al.InsertRange(i,facebytes);i+=bytesSize-1;}}tempBytes=newbyte[al.Count];al.CopyTo(0,tempBytes,0,tempBytes.Length);//ArrayList转byte[]returnEncoding.GetEncoding("GBK").GetString(tempBytes);//byte[]转String}
复制代码 来自:关于转换QQ动静中体系心情,自界说心情和截图的函数
其实net网页编程之所以在曾经独步天下,就是因为他的跨平台、安全性,这两方面,效率可不是net网页编程的强项,反而是他最短的一块挡板,虽然net总是用理论证明比.NET快。 |
|