Stworzyłem małą klasę konstruktora pakietu małych. AddString() działa bez problemów, ale jeśli używam AddInt() Wyjście konsoli wygląda bardzo dziwnie. Każda może powiedzieć mi, dlaczego liczba całkowita nie jest wyświetlana poprawnie?

Główne

Packet packet = new Packet();
        packet.builder.AddString(Constants.Requests.GET_RESOURCES);
        packet.builder.AddString("Another_String");
        packet.builder.AddInt(500);

        byte[] byteArray = packet.builder.GetByteBuffer();
        Console.WriteLine(ByteArrayToString(byteArray));

        

ByteArray Wyjście: Get_resources: Anether_string :? ☺:

47-65-74-5F-52-65-73-6F-75-72-63-65-73-00-3a-41-6E-6F-74-68-65-72-5F-53-74- 72-69-6E-67-00-3a-F4-01-00-00-00-3a

Jak widać:? ☺ zdecydowanie się mylisz. Funkcje są prawie takie same.

Klasa

class Packet
    {
        public Builder builder;

        public Packet()
        {
            builder = new Builder();
        }

        private static string ByteArrayToString(byte[] arr)
        {
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
            return enc.GetString(arr);
        }

        public static string[] Read(byte[] _recievedData)
        {
            string data = ByteArrayToString(_recievedData).Trim();
            string[] result = data.Split(':');

            return result;
        }


        public class Builder
        {

            private byte[] buffer;
            private int offset;

            //Makes very easy on client to filter packets...
            private byte[] seperator;

            public Builder()
            {
                offset = 0;
                buffer = new byte[4096];
                seperator = BitConverter.GetBytes(':');
            }


            public void AddInt(int intValue)
            {
                byte[] byteArray = BitConverter.GetBytes(intValue);
                
                for (int x = 0; x < byteArray.Length; x++)
                {
                    buffer[x + offset] = byteArray[x];
                }

                for (int y = 0; y < seperator.Length; y++)
                {
                    buffer[byteArray.Length + (y + 1) + offset] = seperator[y];
                }

                offset += (byteArray.Length + seperator.Length);
            }

            public void AddString(string str)
            {
                byte[] byteArray = Encoding.ASCII.GetBytes(str);

                for (int x = 0; x < byteArray.Length; x++)
                {
                    buffer[x + offset] = byteArray[x];
                }

                for (int y = 0; y < seperator.Length; y++)
                {
                    buffer[byteArray.Length + (y + 1) + offset] = seperator[y];
                }

                offset += (byteArray.Length + seperator.Length);
            }

            public byte[] GetByteBuffer()
            {
                return buffer;
            }

            public void Reset()
            {
                buffer = null;
                offset = 0;
            }
        }
    
    }
0
Lendoria 21 listopad 2020, 22:31

1 odpowiedź

Najlepsza odpowiedź

Twój kod działa idealnie dobrze. Prawdopodobnie nie jest to, czego chcesz, ale następujący kod konwertuje int w 4 bajtów, ponieważ jest to 32-bitowy liczby całkowitej.

byte[] byteArray = BitConverter.GetBytes(intValue);

Na końcu wyjścia widzisz te 4 bajty zgodnie z oczekiwaniami w małym formacie endian F4-01-00-00, ponieważ 500 w szesnastkowym jest 0x01F4. To wyjaśnia, dlaczego dostajesz, co dostajesz.

Teraz zakładam, że spodziewasz się 500 zamiast ?☺. Następujący kod powinien przynieść żądany wynik:

byte[] byteArray = BitConverter.GetBytes(intValue.ToString());

Spowoduje to dodanie reprezentacji ciągu liczby zamiast reprezentacji binarnej. Na podstawie funkcji zwrotu Read potrzeba wydaje się być reprezentacją ciągu.

1
Ashutosh Raghuwanshi 21 listopad 2020, 20:17