byte[] 到字符串破坏整数

byte[] to string destroying the integers

我创建了一个小的未完成的 Packet Builder class。 AddString() 工作没有问题,但如果我使用 AddInt(),控制台输出看起来很奇怪。谁能告诉我为什么整数显示不正确?

主要

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 Output: Get_Resources:Another_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

如你所见:?☺绝对是错误的。功能都差不多

Class

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;
            }
        }
    
    }

您的代码运行良好。可能这不是您想要的,但以下代码将 int 转换为 4 个字节,因为它是一个 32 位整数。

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

在输出的末尾,您会以小端格式 F4-01-00-00 看到这 4 个字节,因为十六进制的 5000x01F4。这解释了你为什么得到,你得到什么。

现在我假设您期望 500 而不是 ?☺。以下代码应该会获取您想要的结果:

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

这将添加数字的字符串表示而不是二进制表示。基于return类型的Read函数,似乎需要的是字符串表示。