Знаковое расширение ActionScript3 с индексированным доступом к ByteArray

В следующем коде:

var bytes:ByteArray = new ByteArray();

var i:int = -1;
var j:int;

bytes[0] = i;    // bytes[0] = -1 == 0xff
j = bytes[0];    // j == 255;

Int j заканчивается значением 255, а не -1. Кажется, я не могу найти документ, определяющий, как индексированный доступ к ByteArray должен быть расширен знаком - могу ли я надежно предположить это поведение или мне следует предпринять шаги, чтобы урезать такие значения до 8-битных величин? Я переношу кучу кода с Java и предпочел бы использовать индексированный доступ, а не методы readByte() и т.д.


person Steve Wetherill    schedule 19.12.2009    source источник


Ответы (1)


Интерфейс IDataInput (реализованный ByteArray) говорит:

Расширение знака имеет значение только при чтении данных, а не при их записи. Поэтому вам не нужны отдельные методы записи для работы с IDataInput.readUnsignedByte() и IDataInput.readUnsignedShort().

То же самое, естественно, применимо к доступу к массиву [], поэтому вам не нужно усекать перед записью.

Я не вижу никакой явной документации по этому поводу и ничего, что бы указывало на то, что доступ для чтения к массиву не имеет знака. Если вы хотите убедиться, что доступ для чтения вернет вам беззнаковое значение, вы можете сказать:

j= j<<24>>>24;

и аналогично с >> для подписанного. Однако, поскольку ActionScript является отдельной реализацией, а не общим стандартом, вам, вероятно, не о чем беспокоиться.

person bobince    schedule 19.12.2009
comment
Спасибо за ответ. Приятно получить некоторое подтверждение того, что это (чтение с использованием оператора [] в int) действительно не определено. Не так уж важно обходное решение, возможно, будущее обновление прояснит поведение в документации. - person Steve Wetherill; 23.12.2009