相信大家对flash头文件格式都已经比较熟悉了,我在以前的日志中也写过分析flash头文件信息的内容(http://www.roading.net/blog/article.asp?id=43).
但是,flash的文件内容怎么修改呢,flash文件使用utf-8编码,所以为flash添加的数据一定要是utf-8编码的数据.
在flash文件中(本文所说的flash文件均指没有压缩过或者解压过的文件),增加flash文件中某个变量的一个byte,会引起三处的改变:
首先,文件大小个改变,文件大小的数据是flash的第4-8个字节,按照低位到高位的顺序排列.
其次,变量存储区大小改变,这个变量存储区是表明flash文件所以变量的总和.
最后,变量值的改变,也就是所要添加的数据.

下面是一个为flash内的文本增加内容的代码:
程序代码 程序代码

[color=#800000]private
void changeData(int start,byte[] data,int len)
{
 
 int size1=0;
 int size2=0;
 int newsize = (int)data[start] + len;
 //MessageBox.Show(newsize.ToString());
 if(newsize >255)
 {
  size1 = newsize/255;
  data[start] = (byte)(newsize%256);
  if(size1+(int)data[start+1] >255)
  {
   size2 = (size1+(int)data[start+1])/255;
   data[start+1]=(byte)((size1+(int)data[start+1])%256);
   data[start+2]=(byte)(size2+(int)data[start+2]);
  }
  else
  {
   data[start+1]=(byte)((size1+(int)data[start+1]));
  }
 }
 else
 {
  data[start] = (byte)newsize;
 }

}

private void main()
{

 string FILE_NAME = textBox1.Text+".swf";
 FileStream fs;

 FileStream fs1 = new FileStream("1.swf", FileMode.Open, FileAccess.Read);
 BinaryReader r = new BinaryReader(fs1);

 byte[] data = r.ReadBytes((int)(fs1.Length - 1));

 string varname = "drawdata";

 char[] varname_b = varname.ToCharArray();

 int varnamelen = varname_b.Length;
 string str = textBox2.Text;
 //
 byte[] str_b = new UTF8Encoding().GetBytes(str);
 //

 int strlen = str_b.Length;

 byte[] data1 = new byte[data.Length + strlen];

 ////////////////////////////////
 ///修改文件大小
 ///////////////////////////////
 changeData(4,data,strlen);
 /////////////////////////////////
 ///修改变量长度
 ////////////////////////////////
 for(int i=0;i<data.Length-1;i++)
 {
  if((int)data[i] == 0xff && (int)data[i+1] == 0xff && (int)data[i+2] == 0xff)
  {
   i+=5;
   changeData(i,data,strlen);
   break;
  }
 }
 ////////////////////////////////
 ///
 ///////////////////////////////
 int sign=0;
 for(int i=0;i<data.Length-1;i++)
 {
  if((char)data[i] == varname_b[0])
  {
   int x=0;
   for(int j=0;j<varnamelen;j++)
   {
    if((char)data[i+j] == varname_b[j])
    {
     x++;
    }
   }
   if(x == varnamelen)
   {
    sign = i;
    //i-=4;
    changeData(i-4,data,strlen);
    break;
   }


  }

 }
 ////////////////////////////////
 ///
 ////////////////////////////////
 for(int i=0;i<data.Length-1;i++)
 {
  if(i< sign +varnamelen+1)
  {
   data1[i] = data[i];
  }
  else if(i == sign +varnamelen+1)
  {
   for(int j=0;j<strlen;j++)
   {
    data1[i+j] = str_b[j];
   }
  }
  else
  {
   data1[i+strlen] = data[i];
  }

 }
 

 if (File.Exists(FILE_NAME))
 {
  //Console.WriteLine("{0} already exists!", FILE_NAME);
  fs = new FileStream(FILE_NAME, FileMode.Open);
  //return;
 }
 else
 {
  fs = new FileStream(FILE_NAME, FileMode.CreateNew);
 }
 BinaryWriter w = new BinaryWriter(fs);
 w.Write(data1);
 w.Close();
 r.Close(); 
}

[/color]
posted on 2006-08-16 01:04  榻榻米  阅读(1305)  评论(1编辑  收藏  举报