所以我使用C#套接字将字符串从一个进程发送到另一个进程。我使用字节数组发送字符串。当我在调试期间在每个进程中使用GetString(Byte [])时,当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()时没有偏移问题。正如我所提到的,如果我比较Visual Studio调试器中每个Byte []中的整数值,它们具有相同的值!我不明白发生了什么。
答案 0 :(得分:-1)
您在发送时使用ASCII.GetBytes(),但在解码收到的字节[]时使用UTF8.GetString()。