【问题标题】:How to convert AS3 ByteArray into wchar_t const* filename? (Adobe Alchemy)如何将 AS3 ByteArray 转换为 wchar_t const* 文件名? (土坯炼金术)
【发布时间】:2010-07-28 13:57:37
【问题描述】:

如何将AS3ByteArray转换成wchar_t const* filename

所以在我的 C 代码中,我有一个函数正在等待带有 void fun (wchar_t const* filename) 的文件,如何将我的 ByteArray 发送到该函数? (或者,我应该如何重写我的函数?)

【问题讨论】:

标签: c++ c actionscript-3 adobe alchemy


【解决方案1】:

一个四个月大的问题。迟到总比没有好?

在 AS3 中将 ByteArray 转换为 String 有两种方法,具体取决于 String 的存储方式。首先,如果你使用writeUTF,它会先写一个unsigned short代表字符串的长度,然后再写出字符串数据。字符串最容易以这种方式恢复。下面是它在 AS3 中的实现方式:

byteArray.position = 0;
var str:String = byteArray.readUTF();

或者,toString 也适用于这种情况。第二种存储方式是使用writeUTFBytes。这不会将长度写入开头,因此您需要以某种方式独立跟踪它。听起来您希望整个 ByteArray 成为单个 String,因此您可以使用 ByteArray 的length

byteArray.position = 0;
var str:String = byteArray.readUTFBytes(byteArray.length);

既然你想用 Alchemy 做这个,你只需要转换上面的代码。这是第二个示例的转换:

std::string batostr(AS3_Val byteArray) {
    AS3_SetS(byteArray, "position", AS3_Int(0));
    return AS3_StringValue(AS3_CallS("readUTFBytes", byteArray,
        AS3_Array("AS3ValType", AS3_GetS(byteArray, "length")) ));
}

当然,这有大量的内存泄漏,因为我没有在任何地方打电话给AS3_Release。我在自己的代码中使用了AS3_Val 的 RAII 包装器......为了我的理智。你也应该这样。

无论如何,我的函数返回的std::string 将是UTF-8 多字节。任何用于转换为宽字符的标准 C++ 技术都应该从这里开始工作。 (在网站上搜索无休止的转贴)不过,我建议保持原样。我想不出在这个平台上使用宽字符有什么好处。

【讨论】:

  • RAII 包装器...嗯...你能提供任何链接吗?
  • @Jak:创建一个类,其中一个构造函数获取一个 AS3_Val 并存储它。它的复制构造函数复制另一个对象的 AS3_Val 并调用AS3_Acquire。在析构函数中它调用AS3_Release。这是基本功能。
猜你喜欢
  • 1970-01-01
  • 2011-06-20
  • 2015-08-05
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2013-03-19
相关资源
最近更新 更多