Не всегда так.
byte byteValue=-1;
int value=byteValue0xff;
в итоге мы получим value==255ж, это хитрый хот для перевода signed byte в unsigned byte;

Вчера вечером не допёр, а сегодня мы тут внимательно посмотрели вот на что:

    public static int VaxInteger(byte[] buffer, int index, int length)

т.е там c самого начала буфер unsigned byte и вроде как приводить никого никуда не надо. Да и само вриведение можно сделать намного проще и понятнее:
        sbyte i = -1;
        byte j = (byte)i;
        byte k = (byte) (i & 0xff);
        int l = i & 0xff;
        int m = (byte) i;
результат
j = k = l = m = 255.

И ещё, ели даже там был бы sbyte[] buffer, то никто не отменял арифметическое или, т.е. конструкция

newValue += (buffer[i++] & 0xff) << shift;

будет проще и понятнее выглядеть в таком виде:

newValue |= buffer[i++] << shift;

Т.е. версия метода такая:

        public static int VaxInteger(byte[] buffer, int index, int length)
        {
            int newValue = 0;
            int shift = 0;

            while (-- length >= 0)
            {
                newValue |= buffer[index] << shift;
                index ++;
                shift += 8;
            }

            return newValue;
        }

Как думаете?

Ответить