打印

[asp.net教程] 编程实现qq表情文件cfc格式(1)

编程实现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数组。

TOP

返回顶部
AYBlue

Processed in 0.043745 second(s), 7 queries.

当前时区 GMT+8, 现在时间是 2009-1-10 12:03 京ICP备06054220号

清除 Cookies - 联系我们 - 163K.com - Archiver - WAP