自从AS3引入ByteArray之后,可以玩的花样更多了,下面这种把SWF植入AS3的用法虽不常用,但是绝对可以满足初级代码控的需求。
思路就是把SWF或者PNG/JPG的资源二进制文件流,以ASCII CODE的方式放置在一个AS数组,运行时写入到ByteArray中去,再用loadBytes加载到场景。
这种方式比较适合把一些小的SWF文件嵌入到AS代码中去,不建议植入大文件或者大量植入。
这种方式比较适合把一些小的SWF文件嵌入到AS代码中去,不建议植入大文件或者大量植入。
原理:

/* generic by swf2class */
/* original file: as2laucher.swf*/
package
{
import flash.display.Loader;
import flash.utils.ByteArray;
public class Test extends Loader
{
public function Test()
{
super();
var bytes:Array=[67,87,83,9,73,11,0,0,120,-100,-83,
86,75,83,-29,70,16,110,61,108,11,99/*,...*/];
var bin:ByteArray=new ByteArray();
for(var i:int=0;i<bytes.length-1;bin.writeByte(bytes[i++]));
this.loadBytes(bin);
}
}
}
基于命令行的swf2class代码:

/**
* swf2class
*
* by jackfu
*
* build:
* vc: cl.exe swf2class.c -o swf2class.exe
* gcc: gcc swf2class.c -o swf2class
*
* usage:
* swf2class "swf file" "namespace" "Classname" > Classname.as
*/
#include <stdio.h>
int main(int argc, char** argv)
{
FILE *fp;
char buffer[1];
char *pfile; // swf filename
char *pns; // namespace
char *pclass; // class name
if (argc<4)
{
printf("usage:\n\t%s swf namespace classname\n", argv[0]);
return 0;
}
pfile = argv[1];
pns = argv[2];
pclass = argv[3];
fp = fopen(pfile, "rb");
if (fp)
{
printf("/* generic by swf2class */\n/* original file: %s*/\n\n", pfile);
printf("package %s\n{\n\timport flash.display.Loader;\n\timport flash.utils.ByteArray;\n\n\tpublic class %s extends Loader\n\t{\n\t\tpublic function %s()\n\t\t{\n\t\t\tsuper();\n\t\t\tvar bytes:Array=[", pns, pclass, pclass);
while(!feof(fp))
{
fread(buffer, sizeof(char), 1, fp );
printf("%d,", buffer[0]);
}
printf("];\n\t\t\tvar bin:ByteArray=new ByteArray();for(var i:int=0;i<bytes.length-1;bin.writeByte(bytes[i++]));\n\t\t\tthis.loadBytes(bin);\n\t\t}\n\t}\n}\n");
fclose(fp);
}
return 0;
}
* swf2class
*
* by jackfu
*
* build:
* vc: cl.exe swf2class.c -o swf2class.exe
* gcc: gcc swf2class.c -o swf2class
*
* usage:
* swf2class "swf file" "namespace" "Classname" > Classname.as
*/
#include <stdio.h>
int main(int argc, char** argv)
{
FILE *fp;
char buffer[1];
char *pfile; // swf filename
char *pns; // namespace
char *pclass; // class name
if (argc<4)
{
printf("usage:\n\t%s swf namespace classname\n", argv[0]);
return 0;
}
pfile = argv[1];
pns = argv[2];
pclass = argv[3];
fp = fopen(pfile, "rb");
if (fp)
{
printf("/* generic by swf2class */\n/* original file: %s*/\n\n", pfile);
printf("package %s\n{\n\timport flash.display.Loader;\n\timport flash.utils.ByteArray;\n\n\tpublic class %s extends Loader\n\t{\n\t\tpublic function %s()\n\t\t{\n\t\t\tsuper();\n\t\t\tvar bytes:Array=[", pns, pclass, pclass);
while(!feof(fp))
{
fread(buffer, sizeof(char), 1, fp );
printf("%d,", buffer[0]);
}
printf("];\n\t\t\tvar bin:ByteArray=new ByteArray();for(var i:int=0;i<bytes.length-1;bin.writeByte(bytes[i++]));\n\t\t\tthis.loadBytes(bin);\n\t\t}\n\t}\n}\n");
fclose(fp);
}
return 0;
}
可以考虑用于核心代码的加密
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述