Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字节[]中的GetString在通过套接字发送后产生不同的_C#_Sockets - Fatal编程技术网

C# 字节[]中的GetString在通过套接字发送后产生不同的

C# 字节[]中的GetString在通过套接字发送后产生不同的,c#,sockets,C#,Sockets,因此,我使用C#套接字将字符串从一个进程发送到另一个进程。我使用字节数组发送字符串。在调试期间,当我在每个进程中使用GetString(Byte[])时,当字节数组中的值从调试器的角度来看完全相同时,我会得到不同的结果。在使用套接字发送字符串的过程中,当使用GetString()时,我得到了相同的字符串。然而,在收到另一个尺寸的数据后,我又开始胡言乱语 要发送我使用的字符串,请执行以下操作: String strToSend = "This is just a test";

因此,我使用C#套接字将字符串从一个进程发送到另一个进程。我使用字节数组发送字符串。在调试期间,当我在每个进程中使用GetString(Byte[])时,当字节数组中的值从调试器的角度来看完全相同时,我会得到不同的结果。在使用套接字发送字符串的过程中,当使用GetString()时,我得到了相同的字符串。然而,在收到另一个尺寸的数据后,我又开始胡言乱语

要发送我使用的字符串,请执行以下操作:

        String strToSend = "This is just a test";
        Byte[] stringBytes = System.Text.Encoding.ASCII.GetBytes(strToSend);
        Int32 stringSize = stringBytes.Length;
        Int32 messageLengthInBytes = sizeof(Byte) + sizeof(Int32) + sizeof(Int32) + stringSize;

        Byte[] message = new Byte[messageLengthInBytes];
        message[0] = (Byte)MessageType.SendString;

        unsafe
        {
            Marshal.Copy((IntPtr)(Int32*)&messageLengthInBytes, message, 1, sizeof(Int32));
            Marshal.Copy((IntPtr)(Int32*)&stringSize, message, 5, sizeof(Int32));
            GCHandle pinnedArray = GCHandle.Alloc(stringBytes, GCHandleType.Pinned);
            IntPtr pointer = pinnedArray.AddrOfPinnedObject();
            Marshal.Copy((IntPtr)(Int32*)&pointer, message, 9, stringSize);
            pinnedArray.Free();
        }

        this.connection.SendMessage(message);
要在另一个进程中接收字符串,我使用:

                messageType = (MessageType)data[dataOffset];
                Debug.WriteLine(messageType.ToString());
                dataOffset++;

                Marshal.Copy(data, dataOffset, (IntPtr)(Int32*)&messageLengthInBytes, sizeOfInt32);
                dataOffset += sizeOfInt32;
                    Int32 stringSize = 0;
                    Marshal.Copy(data, dataOffset, (IntPtr)(Int32*)&stringSize, sizeOfInt32);
                    dataOffset += sizeOfInt32;
                    byte[] stringBytes = new byte[stringSize];
                    Array.Copy(data,dataOffset,stringBytes,0,stringSize);
                    dataOffset += stringSize;
                    String recievedString = System.Text.Encoding.UTF8.GetString(stringBytes);
我回来时胡言乱语,看起来像“h�z\0\0\0\0� \0\0\0\0\0��z”


我确信在使用Marshal.Copy()时没有偏移问题。正如我提到的,如果我在VisualStudio调试器中比较每个字节[]中的整数值,它们的值是相同的!我不明白发生了什么。

发送时使用ASCII.GetBytes(),但解码接收的字节[]时使用UTF8.GetString()。

为什么发送时使用
ASCII.GetBytes()
,接收时使用
UTF8.GetString()
?另外,我更愿意使用BinaryReader/Writer而不是Marshal.Copy来处理数据,但这就是我。发送和接收的代码丢失了。而且,这种混乱的数据移动是无法辨认的。请简化!我省略了我的发送和接收方法,因为我认为它们超出了问题的范围,并将添加额外的信息进行筛选。我可以发送/接收Int32和Double,没有问题。是的,但字符是否在安全ASCII集中并不重要。很好的发现。我搞乱了编码类型,忘了往回换。如果两者都是ASCII或UTF8,我会得到相似的结果。@JaredBolin“相似的结果”是什么意思?对于您的测试字符串,这两种编码都会导致相同的字节被发出和解码。这不可能是您的问题的根本原因。