Чтение CUInt32

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Чтение CUInt32

Сообщение Res5 » 23.07.2014 (Ср) 9:49

Возникла необходимость читать cUint32. Есть пример c#:

Код: Выделить всё
         internal uint ReadCUInt32()
        {
            byte code = ReadByte();
            switch (code & 0xE0)
            {
                case 0xE0:
                    return BitConverter.ToUInt32(ReadArray(4, true), 0);
                case 0xC0:
                    byte[] bt = ReadArray(3, true);
                    return BitConverter.ToUInt32(new byte[] { bt[2], bt[1], bt[0], code }, 0) & 0x1FFFFFFF;
                case 0x80:
                case 0xA0:
                    return (uint)(BitConverter.ToUInt16(new byte[] { ReadByte(), code }, 0) & 0x3FFF);
            }
            return (uint)code;
        }

        internal DataStream WriteCUInt32(uint value)
        {
            if (value <= 0x7F)
            {
                WriteByte((byte)value);
                return this;
            }
            if (value <= 0x3FFF)
            {
                byte[] bt = BitConverter.GetBytes((ushort)(value + 0x8000));
                WriteArray(bt, true);
                return this;
            }
            if (value <= 0x1FFFFFFF)
            {
                byte[] bt = BitConverter.GetBytes((uint)(value + 0xC0000000));
                WriteArray(bt, true);
                return this;
            }
            if (value <= 0xFFFFFFFF)
            {
                List<byte> bt = new List<byte>();
                bt.Add(0xE0);
                byte[] arrbt = BitConverter.GetBytes((uint)value);
                bt.AddRange(arrbt);
                WriteArray(bt.ToArray(), true);
                return this;
            }
            return this;
        }


Как читать 1-2 байтовые я разобрался. В примере чтение из потока происходит, а у меня массив . Хотелось бы получить советы/формулы по нахождению 3-5 байтовых.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.07.2014 (Ср) 12:14

Опять у тебя тут что-то странное...
Давай словами, чтобы было понятно, что за функцию ты хочешь.
А этот код мне читать лень.

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Чтение CUInt32

Сообщение Res5 » 23.07.2014 (Ср) 18:57

Я хочу прочитать оппкод(тип) пакета перевести в uint32, а он в формате cUint32 и записан байтами от 1 до 5.

Все пакеты записаны в таком формате:
Код: Выделить всё
CUInt32         Type;
CUInt32         Length;
BYTE[Length]    Buffer;


Реализация для 1-2 байт:
Код: Выделить всё
        Dim cUint32 As UInt32

        Dim pack() As Byte 'тут мой свежеполученный пакет байт данных

        If pack(0) < &H80 Then
            '1 байт
            cUint32 = pack(0)

        ElseIf pack(1) < &H80 Then
            '2 байта
            cUint32 = pack(1) + (pack(0) - &H80) * 256

        ElseIf pack(2) < &H80 Then
            '3 байта
            'тут должна быть формула для перевода 3х байт

        ElseIf pack(3) < &H80 Then
            '4 байта
            'тут должна быть формула для перевода 4х байт

        ElseIf pack(4) < &H80 Then
        '5 байт
        'тут должна быть формула для перевода 5 байт

        End If




Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.07.2014 (Ср) 23:43

1. Я правильно понимаю, что надо перевести массив байтов в аналогичное значение uint32?
2. Откуда у тебя 5 байт? В 32 битах их только 4.

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Чтение CUInt32

Сообщение Res5 » 24.07.2014 (Чт) 2:47

Такие куинты... Макс значение &H80FFFFFFFF. Если такая длинна прийдет в пакете, а такое возможно т.к. сервер может контейнеры слать, либо ошибка в трафике тогда да, тут уже uInt64 надо использовать. Сор за неточность, про контейнерные пакеты я недавно узнал, если их не обрабатывать то uint32 хвататет да, но для полноценности работы программы нужно обрабатывать и их.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 24.07.2014 (Чт) 12:29

Код: Выделить всё
Module All
  Public Function BytesToUint64(ByVal Data() As Byte) As ULong
    Dim Res As ULong = 0

    'For Q As Integer = 0 To Data.Length - 1
    For Q As Integer = Data.Length - 1 To 0 Step -1
      Res = (Res << 8) Or Data(Q)
    Next Q

    Return Res
  End Function

  Public Sub Main()
    Dim Tests As Byte()() = {New Byte() {}, New Byte() {0}, New Byte() {1}, New Byte() {255}, New Byte() {0, 1}, New Byte() {255, 255}, New Byte() {255, 255, 255, 255}, New Byte() {255, 255, 255, 255, 255}, New Byte() {111, 32, 11, 4, 6}}
    'Dim Keys As ULong() = {0, 0, 1, 255, 1, 65535, 4294967295, &HFFFFFFFFFF, &H6F200B0406}
    Dim Keys As ULong() = {0, 0, 1, 255, 256, 65535, 4294967295, &HFFFFFFFFFF, &H6040B206F}

    For Q As Integer = 0 To Tests.Length - 1
      Dim Res = BytesToUint64(Tests(Q))
      Console.WriteLine("#{0,2}: {1,-4}   res:{2} key:{3}", Q, If(Res = Keys(Q), "ok", "FAIL"), Res, Keys(Q))
    Next Q

    Console.ReadKey()
  End Sub
End Module

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Чтение CUInt32

Сообщение Res5 » 24.07.2014 (Чт) 19:57

Не подходит(((. Вот если такой пакет прийдет {&H81, &H1, &H1, &H6} будет сбой(. В этом пакете его тип - &H100, его длинна - &H1, а длее сам буфер - &H6. Получается как. Сравниваю первый байт если он меньше &H80 - число 1 байт , но если он равен или больше - число 2х байтовое, итак далее максимум 5 байт.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 24.07.2014 (Чт) 22:00

Ничего не понимаю.

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Чтение CUInt32

Сообщение Res5 » 24.07.2014 (Чт) 23:17

Печаль вобщем, нужно разбирать c# реализацию. Спасибо на том, что попытался помочь.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList  
cron