Russian Qt Forum

Программирование => С/C++ => Тема начата: Mafiy от Октябрь 31, 2012, 17:51



Название: Массив байт. Конвертация байт
Отправлено: Mafiy от Октябрь 31, 2012, 17:51
Подскажите как можно эти функции из C# реализовать на С++ при помощи Qt
Код:
private MemoryStream _memoryStream= new MemoryStream();

public void WriteUTFBytes(string value)
        {
            //Length - max 65536.
            UTF8Encoding utf8Encoding = new UTF8Encoding();
            byte[] buffer = utf8Encoding.GetBytes(value);
            if (buffer.Length > 0)
                WriteBytes(buffer);
        }
public void WriteBytes(byte[] buffer)
        {
            for (int i = 0; buffer != null && i < buffer.Length; i++)
                _memoryStream.WriteByte(buffer[i]);
        }
public void WriteByte(int value)
        {
            _memoryStream.WriteByte((byte)value);
        }
public void WriteShort(int value)
        {
            byte[] bytes = BitConverter.GetBytes((ushort)value);
            WriteBigEndian(bytes);
        }
private void WriteBigEndian(byte[] bytes)
        {
            if (bytes == null)
                return;
            for (int i = bytes.Length - 1; i >= 0; i--)
            {
                _memoryStream.WriteByte(bytes[i]);
            }
        }

public void WriteUInt24(int value)
        {
            byte[] bytes = new byte[3];
            bytes[0] = (byte)(0xFF & (value >> 16));
            bytes[1] = (byte)(0xFF & (value >> 8));
            bytes[2] = (byte)(0xFF & (value >> 0));
           _memoryStream.Write(bytes, 0, bytes.Length);
        }

Вместо MemoryStream я пробовал использовать Qbuffer
Функцию WriteUInt24 сделал так:
Код:
void ByteArray::WriteUInt24(int value)
{
QByteArray byte;
byte.resize(3);
byte[0] = 0xFF & (value >> 16);
byte[1] = 0xFF & (value >> 8);
byte[3] = 0xFF & (value >> 0);
m_buffer.write(byte);
}
Функцию WriteUTFBytes так:
Код:
void ByteArray::WriteUTFBytes(QString &str)
{
QByteArray byte = str.toUtf8();
m_buffer.write(byte);
}

Но я не совсем уверен, что они правильные.
А как быть с функциями WriteShort и WriteByte я не знаю. так как они принимают тип int.


Название: Re: Массив байт. Конвертация байт
Отправлено: Kurles от Октябрь 31, 2012, 19:58

А как быть с функциями WriteShort и WriteByte я не знаю. так как они принимают тип int.
так же, как и в C# - тупо приведением типа, лишние старшие биты отбросятся.
Код
C++ (Qt)
   int intValut = 7633234; // int
   char charValue = intValut; // byte
   short shortValue = intValut; // short
   char lowByteOfShort = shortValue & 0xff; // младший байт от short
   char highByteOfShort = shortValue / 256; // старший байт от short