Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 替换SWF中的字符串_Flash - Fatal编程技术网

Flash 替换SWF中的字符串

Flash 替换SWF中的字符串,flash,Flash,我们已经为一个大型Flash项目的不同客户修改了几十个SWF版本,现在必须替换每个副本中嵌入在脚本中的一些字符串。其中一些文件的FLA文件很难找到,甚至找不到(我继承了这个烂摊子,重构它目前不是一个选项) 是否有(免费)工具来替换ActionScript中使用的字符串?我尝试将文件转换为XML并返回,但它无法处理字符串中包含的国际字符,因此只能部分转换。大多数字符串都被正确提取,因此另一个工具可以完成这项工作。很棘手-这可能并不容易,但你可以将“锁定”的swf加载到你控制的一个控件中,然后在其对

我们已经为一个大型Flash项目的不同客户修改了几十个SWF版本,现在必须替换每个副本中嵌入在脚本中的一些字符串。其中一些文件的FLA文件很难找到,甚至找不到(我继承了这个烂摊子,重构它目前不是一个选项)


是否有(免费)工具来替换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中实现了相同的概念。