一个四个月大的问题。迟到总比没有好?
在 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++ 技术都应该从这里开始工作。 (在网站上搜索无休止的转贴)不过,我建议保持原样。我想不出在这个平台上使用宽字符有什么好处。