编程实现qq表情文件cfc格式(1)
背景:最近闲来无事,也应论坛某会员要求,想做个qq表情下载的站点。本来事情是很简单的,写个小小的crud也就可以了,但嘻哈呵嘿既然是个.net程序员,当然要使用.net来实现了。今天我们就用.net来实现cfc ( custom face cab? ) 的表情格式的打包功能。
要做到这个功能,我们必须先了解这个格式,首先google一下。我们找到了这一篇来自清华大学的文章:fc文件格式详解
从这篇文章里我们得知了cfc的文件格式大概如下:
一个块有15个字段,如下
md5的字符串形式长度,4个字节
快捷键长度,4字节
表情名称长度,4字节
表情文件名长度,4字节
表情文件长度,4字节
微缩图文件名长度,4字节
微缩文件长度,4字节
表情文件帧数,4字节
图片md5的字符串形式
快捷键
表情名称
表情文件名
微缩图文件名
表情文件内容
微缩图内容
知道了格式就好办了,我们按步就班定义一个结构(struct)
1 struct#region struct
2 public struct faceblock
3 {
4 public uint md5length; //32
5 public uint uintcutlength; //4
6 public uint facenamelength; //4
7 public uint facefilenamelength; //36 md5 + extension
8 public uint filelength;
9 public uint thumbnailfilenamelength; //41 md5 + fixed.bmp
10 public uint thumbnailfilelength;
11 public uint framelength;
12 public string md5;
13 public string uintcuts;
14 public string facename;
15 public string facefilename;
16 public string thumbnailfilename;
17 public byte[] facedata;
18 public byte[] thumbnaildata;
19
20 public static faceblock fromimage(string file)
21 {
22 return facehelper.getfaceblockfromimage(file);
23 }
24
25 byte[] getbytes(uint value)
26 {
27 byte[] bt = bitconverter.getbytes(value);
28 list bytes = new list();
29 bytes.addrange(bt);
30 if (bytes.count < 4)
31 {
32 int l = 4 - bytes.count;
33 for (int i = 0; i < l; i++)
34 bytes.add((byte)0);
35 }
36 return bytes.toarray();
37 }
38
39 public byte[] tobytes()
40 {
41 list bytes = new list();
42 encoding e = encoding.ascii;
43 bytes.addrange(getbytes(md5length));
44 bytes.addrange(getbytes(uintcutlength));
45 bytes.addrange(getbytes(facenamelength));
46 bytes.addrange(getbytes(facefilenamelength));
47 bytes.addrange(getbytes(filelength));
48 bytes.addrange(getbytes(thumbnailfilenamelength));
49 bytes.addrange(getbytes(thumbnailfilelength));
50 bytes.addrange(getbytes(framelength));
51
52 bytes.addrange(e.getbytes(md5));
53 bytes.addrange(e.getbytes(uintcuts));
54 bytes.addrange(e.getbytes(facename));
55 bytes.addrange(e.getbytes(facefilename));
56 bytes.addrange(e.getbytes(thumbnailfilename));
57
58 bytes.addrange(facedata);
59 bytes.addrange(thumbnaildata);
60
61 return bytes.toarray();
62 }
63 }
64 #endregion其中含有两方法,一个是从文件得到一个此结构的静态方法,另一个是将此结构转化为byte数组。