EADever Ответов: 2

Как читать короткие строки в памяти?


Привет я пытаюсь прочитать заголовок 2 байта в шестнадцатеричном формате вот так
52 01


но
MemoryStream

просто разрешите только ReadByte ().

это мой код

ushort size = BitConverter.ToUInt16(new byte[] { (byte)ReceiveStream.ReadByte(), (byte)ReceiveStream.ReadByte() }, 0);
                ReceiveStream.Position -= 2;

                while (size > 0 && size <= (ReceiveStream.Length - ReceiveStream.Position))
                {
                    //Log.Debug("Read: " + size + "-byte packet.");

                    // Read Packet Data including length
                    byte[] data = new byte[size];
                    ReceiveStream.Read(data, 0, size);

                    // Process packet.
                    MemoryStream stream = new MemoryStream(data, 2, data.Length - 2, false);

                    int opcode = stream.ReadByte();//TODO i want to read 2 bytes
                    
					//other code call the opcode value
                }



это моя проблема:
int opcode = stream.ReadByte();


значение кода операции должно быть "152", как и значение заголовка, которое я дал. Но мой код просто читал только "52".

Мне нужна помощь xD

Что я уже пробовал:

ushort size = BitConverter.ToUInt16(new byte[] { (byte)ReceiveStream.ReadByte(), (byte)ReceiveStream.ReadByte() }, 0);
                ReceiveStream.Position -= 2;

                while (size > 0 && size <= (ReceiveStream.Length - ReceiveStream.Position))
                {
                    //Log.Debug("Read: " + size + "-byte packet.");

                    // Read Packet Data including length
                    byte[] data = new byte[size];
                    ReceiveStream.Read(data, 0, size);

                    // Process packet.
                    MemoryStream stream = new MemoryStream(data, 2, data.Length - 2, false);

                    int opcode = stream.ReadByte();//TODO i want to read 2 bytes
                    
					//other code call the opcode value
                }

2 Ответов

Рейтинг:
16

OriginalGriff

Считайте два байта из потока и либо преобразуйте их сами, как вы знаете, каким должен быть порядок байтов:

byte a = 52;
byte b = 1;
ushort result = (ushort)((int) a | (b << 8));


EADever

Спасибо за ваш ответ, но заголовок в два байта динамичен, а не статичен

поэтому я сделал это:

байт а = (байт)трансляция.ReadByte();
byte b = (byte)stream. ReadByte();
ushort opcode = (ushort) ((int)a | (b << 8));

правильно ли это?

OriginalGriff

Да, именно этого я и ожидал от тебя... :)

EADever

Еще раз спасибо за вашу помощь... это работает как заклинание! это новая вещь, которую мне нужно узнать ;)

OriginalGriff

Пожалуйста!

Рейтинг:
1

Mehdi Gholam

Вы можете прочитать 2 байта и сделать сдвиг битов самостоятельно или использовать BinaryReader : Класс BinaryReader (System.IO)[^]