相信大家对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]
但是,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]