我正在与另一个人的程序进行TCP通信。为了正确的通信,他为通过TCP发送的消息定义了Header-Struct。它被定义的东西如下:Visual C++(.NET 4.0) - 序列化/将自定义结构体复制到字节阵列以通过NetworkStream发送
typedef struct
{
uint16_t number1;
uint16_t number2;
char name1[64];
char name2[64];
uint32_t size;
} headerStruct;
的结构以某种方式填充,最重要的headerStruct.size设置头之后的字节数,并且是消息的大小被发送。
我现在试图序列像这样的标题:
headerStruct sourceHeader;
// ... filling Header-Struct here ...
array<Byte>^ result = gcnew array<Byte>(520); // I tried sizeof(headerStruct) instead of '520', but then I get errors
double allreadyCopied = 0;
// serialize uint16_t 'number1'
array<Byte>^ array1 = BitConverter::GetBytes(sourceHeader.number1);
Array::Copy(array1 , 0, result, allreadyCopied, array1 ->Length);
allreadyCopied += array1 ->Length;
// serialize uint16_t 'number2'
array<Byte>^ array2 = BitConverter::GetBytes(sourceHeader.number2);
Array::Copy(array2 , 0, result, allreadyCopied, array2->Length);
allreadyCopied += array2->Length;
// serialize char-Array 'name1'
for (int i = 0; i < sizeof(sourceHeader.name1); i++)
{
array<Byte>^ arrayName1 = BitConverter::GetBytes(sourceHeader.name1[i]);
Array::Copy(arrayName1 , 0, result, allreadyCopied, arrayName1->Length);
allreadyCopied += arrayName1->Length;
}
// serialize char-Array 'name2'
for (int i = 0; i < sizeof(sourceHeader.name2); i++)
{
array<Byte>^ arrayName2 = BitConverter::GetBytes(sourceHeader.name2[i]);
Array::Copy(arrayName2 , 0, result, allreadyCopied, arrayName2->Length);
allreadyCopied += arrayName2->Length;
}
// serialize uint32_t 'size'
array<Byte>^ arraySize = BitConverter::GetBytes(sourceHeader.size);
Array::Copy(arraySize, 0, result, allreadyCopied, arraySize->Length);
allreadyCopied += arraySize->Length;
现在,这似乎为我工作,但:
我尝试使用的sizeof(headerStruct)代替的硬编码值为大小如果结果数组。我只是用变量allreadyCopied“计算”它。但他们为什么不同?我的错误在哪里?
这种方法肯定不是很优雅。有一个更好的方法吗?我试过了元帅级,但没有设法让它工作!
不知何故,感觉这种方法是错误的。这是正确的方式还是我在这里完全错误?
任何帮助感激很多!谢谢!
编辑:
OK刚刚检查:
sizeof(headerStruct); // = 136;
sizeof(char); // = 1;
sizeof(sourceHeader.name1); // = 64;
但
arrayName1->Length; // = 4;
为什么?非常容易混淆:MSDN (link here)表示返回的Array应该是长度为2的,而不是4.
感谢您的帮助Hans!通信肯定需要按照其他人在他的程序中定义它的方式来完成,这意味着:我必须发送包含具有常量大小的Header-Struct的消息,直接跟随具有可变大小的消息主体。你有什么链接怎么写Wrapper Class?我不知道如何使用托管类型时,我发送的字节数组必须看起来像我使用本机类型。 – EliteTUM
当其他人坚持写封包时没有意义。只需使用BinaryWriter。 –