Учитывая случайное значение 27458, когда вы делаете это:
x.setRawData(randomValue.toLocal8Bit().constData(), 2);
вы заполняете массив первыми двумя байтами этой строки : "27458".
И здесь:
int value = tmp.toUInt();
байтовый массив неявно преобразуется в строку ("27"), которая, в свою очередь, преобразуется в числовое значение c (целое число без знака).
Давайте попробуем что-то другое, что, возможно, подойдет вам.
Сначала сохраните значение в переменной Numberri c, возможно, нужного размера (16 бит, 2 байта):
ushort randomValue = qrand() % 65535;
, затем просто возвращайте байтовый массив, построенный с использованием указателя на ushort
, приведенный к char *
(не используйте setRawData
, потому что он не copy байты, которые вы передаете, также объяснили здесь ):
return QByteArray(reinterpret_cast<char *>(&randomValue), 2);
Чтобы вернуться к значению:
QByteArray tmp = generateRandomIDOver2Bytes(); //for example, the value 27458
ushort value;
memcpy(&value, tmp.data(), 2);
Обратите внимание: типы имеют значение Вот. Вы записали uint
в байтовом массиве, вы должны прочитать из него uint
.
Все это можно обобщить в таком классе, как:
template <typename T>
class Value
{
QByteArray bytes;
public:
Value(T t) : bytes(reinterpret_cast<char*>(&t), sizeof(T)) {}
T read() const
{
T t;
memcpy(&t, bytes.data(), sizeof(T));
return t;
}
};
, чтобы вы могли иметь обобщенную c функцию, такую как:
template<typename T>
Value<T> generateRandomIDOverNBytes()
{
T value = qrand() % 65535;
qDebug() << value;
return Value<T>(value);
}
и безопасно использовать предпочитаемый вами тип для хранения случайного значения:
Value<ushort> value16 = generateRandomIDOverNBytes<ushort>();
qDebug() << value16.read();
Value<int> value32 = generateRandomIDOverNBytes<int>();
qDebug() << value32.read();
Value<long long> value64 = generateRandomIDOverNBytes<long long>();
qDebug() << value64.read();