Я работаю над TCP-коммуникацией с программой другого человека.Для правильной связи он определил структуру заголовка для сообщений, отправляемых через TCP.Это определяется следующим образом:
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) вместо жестко заданного значения 520 для размера в массиве результатов.Я просто «вычислил» его с помощью переменной allreadyCopied .Но почему они разные?Где моя ошибка здесь?
Этот метод, безусловно, не очень элегантный.Есть лучший способ сделать это?Я попробовал маршал-класс, но мне не удалось заставить его работать!
Почему-то кажется, что такой подход неправильный.Это правильный путь или я совершенно не прав?
Любая помощь очень ценится!Спасибо!
Редактировать:
OK только что проверил:
sizeof(headerStruct); // = 136;
sizeof(char); // = 1;
sizeof(sourceHeader.name1); // = 64;
НО
arrayName1->Length; // = 4;
Почему ?Очень запутанно: MSDN (ссылка здесь) говорит, что возвращаемый массив должен иметь длину 2, а не 4.