Как записать в Byte[] данные других типов?

  • Автор темы Igorg
  • Дата начала
Статус
Закрыто для дальнейших ответов.
I

Igorg

#1
Помогите, пожалуйста, разрешить след. проблему (я только-только начал C# изучать, поэтому никак не могу найти нужное решение).
Имеем код:
Код:
		public Boolean SendData(Byte[] data, Int32 size)
{
Byte[] packet = new Byte[packetSize];
Int32 packetCount;

// Расчет количества пакетов, необходимых для передачи массива данных
packetCount = size / (packetSize - PACKET_HEAD_SIZE);
if ((size % (packetSize - PACKET_HEAD_SIZE)) != 0)
{
// В случае, если данные не умещаются в целое количество пакетов,
// необходимо добавить еще один пакет
packetCount++;
}

// Цикл отправки пакетов
for (int i = 0, offset = 0; i < packetCount; i++)
{
Int16 packetType, packetCRC;
Int32 packetDataLength;
Int32 packetTypeOffset, packetCRCOffset, packetDataLengthOffset, packetDataOffset;

// Сформируем пакет
packetTypeOffset = 0;
packetCRCOffset = packetTypeOffset + sizeof(Int16);
packetDataLengthOffset = packetCRCOffset + sizeof(Int16);
packetDataOffset = packetDataLengthOffset + sizeof(Int32);

... // Записываем поля заголовка и данные в пакет. Вот здесь-то и возникает проблема

SendPacket(packet);
}
return true;
}
Этот код разбивает массив данных на пакеты фиксированного размера и отправляет в последовательный порт. Пакет - массив байт. Имеет заголовок, в заголовке три поля размерами Int16, Int16 и Int32 (packetType, packetCRC, packetDataLength). Не пойму как их после инициализации вписать в пакет. Нужных методов не нашел. В MSDN есть пример SerialLCDCS, так там они вот что использовали:
Код:
ushort crc = CRCGenerator.GenerateCRC(packetXMitBuffer, dataLength + 2, CRC_SEED);
private byte[] packetXMitBuffer[2 + dataLength + 1] = (byte)(crc >> 8);
packetXMitBuffer[2 + dataLength] = (byte)crc;
что, по-моему, несколько искусственно. Или я уже совсем ничего не понимаю?
 
I

Igorg

#3
Благодарю! Я сначала не придал этой теме значения...
 
I

Igorg

#4
Прошу прощения, в предыдущем посте поторопился с выводами о структурах и объединениях в C#. В конечном итоге сделал так (может кому пригодится):
Код:
		private struct PacketHeaderStruct
{
public Int16 packetType;
public Int16 packetCRC;
public Int32 packetDataLength;
};
...
public Boolean SendData(Byte[] data, Int32 size)
{
Byte[] packet = new Byte[packetSize];
PacketHeaderStruct packetHeader = new PacketHeaderStruct();
Int32 packetCount;

if (isOpen == false)
{
UnauthorizedAccessException e = new UnauthorizedAccessException("Serial port not open");
throw e;
}

// Расчет количества пакетов, необходимых для передачи массива данных
packetCount = size / (packetSize - PACKET_HEAD_SIZE);
if ((size % (packetSize - PACKET_HEAD_SIZE)) != 0)
{
// В случае, если данные не умещаются в целое количество пакетов,
// необходимо добавить еще один пакет
packetCount++;
}

// Цикл отправки пакетов
for (int i = 0, offset = 0; i < packetCount; i++)
{
int j;
Int32 packetDataLength;
IntPtr unmanagedMemPtr;

// Сформируем пакет
// Заполним поле данных пакета данными из data
for (j = 0; (j < (packetSize - PACKET_HEAD_SIZE)) && (offset < size); j++, offset++)
{
packet[PACKET_HEAD_SIZE + j] = data[offset];
}
packetDataLength = j;  // Длина поля данных
// Если поле данных не заполнено целиком, то оставшееся пространство заполнить нулями
if (packetDataLength < (packetSize - PACKET_HEAD_SIZE))
{
for (j = 0; j < (packetSize - (PACKET_HEAD_SIZE + packetDataLength)); j++)
{
packet[PACKET_HEAD_SIZE + packetDataLength + j] = 0;
}
}

// Сформируем и запишем заголовок
packetHeader.packetType = 0; // кодируется тип пакета
packetHeader.packetCRC = 0; // сюда поместить контрольную сумму
packetHeader.packetDataLength = packetDataLength;

unmanagedMemPtr = Marshal.AllocHGlobal(PACKET_HEAD_SIZE);
Marshal.StructureToPtr(packetHeader, unmanagedMemPtr, false);
Marshal.Copy(unmanagedMemPtr, packet, 0, PACKET_HEAD_SIZE);

if (SendPacket(packet) != true)
{
Exception e = new Exception("Невозможно отослать пакет");
throw e;
}
}
return true;
}
Да... Тяжело изучать новый язык второпях...
 
Статус
Закрыто для дальнейших ответов.