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

Тема в разделе ".NET", создана пользователем Igorg, 2 мар 2007.

Статус темы:
Закрыта.
  1. Igorg

    Igorg Гость

    Помогите, пожалуйста, разрешить след. проблему (я только-только начал C# изучать, поэтому никак не могу найти нужное решение).
    Имеем код:
    Код (Text):
            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, так там они вот что использовали:
    Код (Text):
    ushort crc = CRCGenerator.GenerateCRC(packetXMitBuffer, dataLength + 2, CRC_SEED);
    private byte[] packetXMitBuffer[2 + dataLength + 1] = (byte)(crc >> 8);
    packetXMitBuffer[2 + dataLength] = (byte)crc;
    что, по-моему, несколько искусственно. Или я уже совсем ничего не понимаю?
     
  2. Pasha

    Pasha Гость

  3. Igorg

    Igorg Гость

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

    Igorg Гость

    Прошу прощения, в предыдущем посте поторопился с выводами о структурах и объединениях в C#. В конечном итоге сделал так (может кому пригодится):
    Код (Text):
            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;
    }
    Да... Тяжело изучать новый язык второпях...
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей