Четырехмесячный вопрос. Лучше поздно, чем никогда?
Чтобы преобразовать ByteArray в строку в AS3, есть два способа, в зависимости от того, как была сохранена строка. Во-первых, если вы используете writeUTF
, он сначала запишет unsigned short
, представляющий длину строки, а затем запишет строковые данные. Строка проще всего восстановить таким способом. Вот как это делается в AS3:
byteArray.position = 0;
var str:String = byteArray.readUTF();
Кроме того, toString
также работает в этом случае. Второй способ хранения - с writeUTFBytes
. Это не будет записывать длину в начало, поэтому вам нужно как-то отслеживать ее независимо. Похоже, вы хотите, чтобы весь ByteArray был одной строкой, поэтому вы можете использовать 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
. Я использую оболочку RAII для AS3_Val
в своем собственном коде ... ради моего здравомыслия. Как и вы.
В любом случае, std::string
, которую возвращает моя функция, будет многобайтовым UTF-8. Любая стандартная техника C ++ для преобразования в широкие символы должна работать отсюда. (ищите на сайте бесконечные репосты) Я предлагаю оставить все как есть. Я не могу придумать никакого преимущества использования широких символов на этой платформе.