Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   что такое отрицательный байт? (http://www.flasher.ru/forum/showthread.php?t=178714)

gagaga 27.04.2012 13:45

что такое отрицательный байт?
 
Код AS3:

trace(byteArray.readByte().toString(2))

возвращает отрицательное значение.. как его превратить в обычный байт или что это вообще такое и почему? не понятно

Aquahawk 27.04.2012 13:51

readUnsignedByte() не?

Добавлено через 35 секунд
и вообще справку по байтарраю почитать?

gagaga 27.04.2012 13:54

Цитата:

Сообщение от Aquahawk (Сообщение 1077248)
readUnsignedByte() не?

Добавлено через 35 секунд
и вообще справку по байтарраю почитать?

а объяснить что такое отрицательный байт не? мне надо выяснить что приходит в сокет

Aquahawk 27.04.2012 14:02

а чем вам не нравится отрицательный байт? Любые целые числа это просто набор бит, хотим понимаем его как знаковый набор, а хотим как беззнаковый. Вот в вики почитать можно. В яве вон вообще беззнаковых нету, и ничего, живут.

gagaga 27.04.2012 14:11

спасибо

Aquahawk 27.04.2012 14:13

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

gagaga 27.04.2012 14:24

может вы мне еще расскажите http://tools.ietf.org/html/draft-iet...l-17#section-5 что такое RSV, ато я не понять, очень сложно написано

Aquahawk 27.04.2012 14:41

не, вот тут я пас, а зачем вам WebSocket? Я никогда с ними не работал и понятия не имею что это. Прочитали хелп адоба про сокет?

gagaga 27.04.2012 14:43

Прочитал.. веб сокет мы взяли временно, пока не можем заставить nginx слать бинарные данные через модуль push

wvxvw 27.04.2012 15:59

Отрицательный байт во флеше (имейте в виду, что не всегда используется одна и та же запись для негативных чисел в разных языках).
Любое число можно представить в "бинарной" форме, где каждый порядок, это 2 возведенное в степень равную расстоянию от конца числа.
Код:

Т.е. 101010 это:
  0 * 2^0 = 0
  1 * 2^1 = 2
  0 * 2^2 = 0
  1 * 2^3 = 8
  0 * 2^4 = 0
  1 * 2^5 = 32
+ ------------
= 2 + 8 + 32 = 42

Чтобы иметь возможность записать знак числа нам нужно потратить один порядок на его хранение. Мы могли бы выделить 1 бит в начале числа для знака а остальные биты использовать для записи беззнакового числа. Но, в такой ситуации мы бы получили отрицательный и положительный ноль (например, в числах с плавающей запятой именно так и происходит - в них есть положительные и отрицательные нули). Но в целых числах используется прием complement two.

complement - замена всех единиц нулями, а всех нулей - единицами, в AS3 эту опреацию выполняет оператор ~ (тильда).

complement two - выполнить complement и прибавить единицу. Т.е. получение отрицательного числа можно расписать как:

Код AS3:

function minus(x:int):int { return ~x + 1; }

Таким образом, мы, опять же, храним в крайнем левом бите знак, а во всех остальных - значение числа, если оно положительное, или его дополнение (complement), если оно отрицательное. Посмотрим на пример выше (в байте у нас 8 битов):

0 0101010 = 42

рассчитаем -42

complement: 0 1010101 (заменили все нули единицами и единицы нулями).
sign: 1 1010101 (заменили знаковый бит).
add 1: 1 1010110 (сложили последний бит с 1, но т.как 2 "не помещается" в порядок, то увеличили значение в следующем порядке).

Побочным явлением такого подхода так же является то, что модуль самого маленького отрицательного числа, которое мы можем записать на единицу больше модуля самого большого положительного числа, которое мы можем записать.

Проверка:
Код AS3:

private function verify():void
{
        var bytes:ByteArray = new ByteArray();
        bytes[0] = -42;
        trace(uint(-42).toString(2).substr(-8, 8), // 11010110
                bytes[0].toString(2), // 11010110
                bytes[0].toString(2) == "11010110"); // true
}



Часовой пояс GMT +4, время: 23:03.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.