2010-03-13 2 views
2

Как конвертировать AS3 ByteArray в wchar_t const* filename?Как преобразовать AS3 ByteArray в wchar_t const * filename? (Adobe Alchemy)

Итак, в моем C-коде у меня есть функция, ожидающая файл с void fun (wchar_t const* filename), как отправить на эту функцию мой ByteArray? (Или, как мне переписать мою функцию?)

+0

Я не занимаюсь этим предметом, но я полагаю, что эта ссылка может дать вам некоторое представление: http://stackoverflow.com/questions/360353/any-way-to-convert-a-regular-string- in-actionscript-3-to-a-bytearray-of-latin-1-c –

ответ

3

Четырехмесячный вопрос. Лучше поздно, чем никогда?

Чтобы преобразовать 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++ для преобразования в широкие символы должен работать отсюда. (найдите сайт для бесконечных репостов). Я предлагаю оставить его как есть. Я не могу придумать каких-либо преимуществ использования широких символов на этой платформе.

+0

RAII-обертка ... hm ... можете ли вы предоставить какие-либо ссылки? – Rella

+0

@Jak: Создайте класс, в котором один конструктор берет AS3_Val и сохраняет его. Его экземпляр копирования копирует AS3_Val другого объекта и вызывает 'AS3_Acquire'. В деструкторе он вызывает 'AS3_Release'. Это основная функциональность. – Gunslinger47

Смежные вопросы