Четырехмесячный вопрос. Лучше поздно, чем никогда?
Чтобы преобразовать ByteArray в строку в AS3, есть два способа в зависимости от того, как была сохранена String. Во-первых, если вы используете writeUTF
, он сначала напишет unsigned short
, представляющий длину строки, а затем выпишите строковые данные. Строку проще всего восстановить таким образом. Вот как это делается в AS3:
byteArray.position = 0;
var str:String = byteArray.readUTF();
В качестве альтернативы, toString
также работает в этом случае. Второй способ хранения - writeUTFBytes
. Это не будет писать длину до начала, так что вам нужно будет каким-то образом отслеживать ее. Похоже, вы хотите, чтобы весь ByteArray был единственным String, поэтому вы можете использовать ByteArray's length
.
byteArray.position = 0;
var str:String = byteArray.readUTFBytes(byteArray.length);
Поскольку вы хотите сделать это с помощью Алхимии, вам просто нужно преобразовать вышеуказанный код. Вот преобразование второго примера:
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 multibyte. Любой стандартный метод C++ для преобразования в широкие символы должен работать отсюда. (найдите сайт для бесконечных репостов). Я предлагаю оставить его как есть. Я не могу придумать каких-либо преимуществ использования широких символов на этой платформе.
Я не занимаюсь этим предметом, но я полагаю, что эта ссылка может дать вам некоторое представление: http://stackoverflow.com/questions/360353/any-way-to-convert-a-regular-string- in-actionscript-3-to-a-bytearray-of-latin-1-c –