Flash 替换SWF中的字符串
我们已经为一个大型Flash项目的不同客户修改了几十个SWF版本,现在必须替换每个副本中嵌入在脚本中的一些字符串。其中一些文件的FLA文件很难找到,甚至找不到(我继承了这个烂摊子,重构它目前不是一个选项)Flash 替换SWF中的字符串,flash,Flash,我们已经为一个大型Flash项目的不同客户修改了几十个SWF版本,现在必须替换每个副本中嵌入在脚本中的一些字符串。其中一些文件的FLA文件很难找到,甚至找不到(我继承了这个烂摊子,重构它目前不是一个选项) 是否有(免费)工具来替换ActionScript中使用的字符串?我尝试将文件转换为XML并返回,但它无法处理字符串中包含的国际字符,因此只能部分转换。大多数字符串都被正确提取,因此另一个工具可以完成这项工作。很棘手-这可能并不容易,但你可以将“锁定”的swf加载到你控制的一个控件中,然后在其对
是否有(免费)工具来替换ActionScript中使用的字符串?我尝试将文件转换为XML并返回,但它无法处理字符串中包含的国际字符,因此只能部分转换。大多数字符串都被正确提取,因此另一个工具可以完成这项工作。很棘手-这可能并不容易,但你可以将“锁定”的swf加载到你控制的一个控件中,然后在其对象中爬行,直到你点击TextBox,使用一些for…in循环-映射它们然后更改它们将是一个漫长而艰巨的过程,特别是如果以前的开发人员没有以一种有用的方式命名东西,但是如果它是一个相当简单的.swf,那么它可能太糟糕了
此外,还有一个仅用于反编译SWF的mac实用程序,我记得一位同事曾发誓过,但我不记得它的名字。。。有人吗?我能想到的唯一建议是修复swfmill以支持国际角色。您可能需要在swfmill邮件列表中询问(swfmill@swfmill.org就我所知)如果你对C/C++略知一二,那么最好的方法应该不会太难。难的一个-你试过反编译器吗?如果这不起作用,我会说尝试将swf加载到另一个swf中,然后向下钻取并更改文本字段的内容-类似于
\u root.loadedswf.clip1.box2.textfield.text=“New text”代码>
显然,如果应用程序很复杂,这可能不起作用。你可以试试Burak的——上面写着URL,但我很确定它可以让你编辑SWF中的任何文本。我没有用过它,但我用过他的ActionScript查看器,它工作得非常好。如果文件使用的是ActionScript 2,那么您可以使用进行反汇编和重新汇编(当然,还可以在重新汇编之前修改字符串)。对于as3,adobe提供了一个反编译器,可以用来实现同样的功能,但如果你继承了它,我认为你的flash不会是as3。这个怎么样?
在我看来,swfmill已经更新了他们的工具,以支持国际字符,至少是拉脱维亚语(需要UTF-8)。字符串被编码为HTML实体
解决了遗留swf文件的一些类似问题。您可以用于此类任务。它允许您更改SWF和SWC文件中的ActionScript 3字节码
对于您的任务,我更喜欢Scala源分支。基本上,代码如下所示:
val swf = Swf from "in.swf"
for(tag <- swf.tags) {
(Abc fromTag tag) match {
case Some(abc) => {
val strings = abc.cpool.strings
for(i <- 1 until strings.length) {
if(strings(i) == 'search) {
strings(i) = 'replacement
}
}
abc write tag
}
case None =>
}
swf write "out.swf"
val swf=in.swf中的swf
用于(标签){
val strings=abc.cpool.strings
为了
}
swf写“out.swf”
您可以尝试在舞台上和actionscript中替换文本
下面是一个例子,展示了如何做到这一点:这一个也非常有效,而且是免费的:
Apparat在这方面做得很好(我有一些遗留文件需要修改)。我无法让Joa的Scala代码正常工作,所以我最终用Java实现了他的解决方案
下载
确保安装了Scala(尽管解决方案是纯Java的,但仍然需要这些库)
使用适当的类路径(指向包含Apparat二进制文件的文件夹以及Scala库)编译并运行下面的代码。
javac-classpath“;apparat/*;C:/path/to/scala/lib/*”SwfEditor.java
java-classpath“;apparat/*;C:/path/to/scala/lib/*”SwfEditor
导入apparat.swf.swf;
进口设备,网址:abc.abc;
进口设备;swf.SwfTag;
导入scala.collection.Iterator;
导入scala.Symbol;
导入apparat.swf.DoABC;
类SwfEditor{
公共静态void main(字符串[]args){
Swf输入=Swf.fromFile(“in.Swf”);
迭代器iter=input.tags().Iterator();
while(iter.hasNext()){
SwfTag tag=iter.next();
if(标记DoABC的实例){
DoABC DoABC标记=(DoABC)标记;
Abc=Abc.fromTag(doABCTag).getOrElse(null);
符号[]字符串=abc.cpool().strings();
for(int i=0;当它试图写入替换的字符串时,我得到了apparat.abc.AbcOutputStream.writeU30。你能帮忙吗?我无法让上面的Scala代码工作。我最终在Java中实现了相同的概念。