Conversión de Cadena Hexadecimal a QByteArray
Para transformar una cadena de caracteres hexadeciamles en un QByteArray, se puede implementar una función que divida la cadena en pares de dos caracteres, convierta cada par a un byte numérico y los acumule en un QByteArray. Se debe manejar errores para caracteres no válidos.
QByteArray convertirHexABytes(const QString &cadenaHex)
{
bool exito;
QByteArray resultado;
QString hexLimpio = cadenaHex.trimmed().simplified();
QStringList paresHex;
int totalPares = hexLimpio.length() / 2;
for (int i = 0; i < totalPares; i++)
{
paresHex.append(hexLimpio.mid(i * 2, 2));
}
foreach (const QString &par, paresHex) {
if (!par.isEmpty())
{
char byte = par.toInt(&exito, 16) & 0xFF;
if (exito) {
resultado.append(byte);
} else {
qDebug() << "Par hexadecimal inválido:" << par;
}
}
}
return resultado;
}
// Ejemplo de uso
QByteArray datos = convertirHexABytes("A1B2C3D4E5F6");
qDebug() << datos;
Conversión de QByteArray a Cadena Hexadecimal
Para obtener la representación hexadecimal de un QByteArray, se utiliza el método toHex() seguido de toUpper() para mayúsculas, y se convierte a QString.
QByteArray datosEnBytes;
QString cadenaHex = QString(datosEnBytes.toHex().toUpper());
Conversiones de Endianness en Qt
El endianness define cómo se almacenan los bytes de un valor en memoria. En big-endian, el byte más significativo está en la dirección más baja; en little-endian, ocurre lo contrario. Las arquitecturas x86 comúnmente usan little-endian, mientras que el orden de red es big-endian.
En el almacenamiento de archivos, fwrite() escribe los bytes en el orden en que están en memoria. Por ejemplo, en un sistema little-endian, el entero 0x11223344 se guarda como "44332211".
Qt proporciona funciones en <QtEndian> para manejar estas conversiones, que se adaptan automáticamente según la arquitectura del host.
T qFromBigEndian(const uchar *src)
T qFromBigEndian(T src)
T qFromLittleEndian(const uchar *src)
T qFromLittleEndian(T src)
void qToBigEndian(T src, uchar *dest)
T qToBigEndian(T src)
void qToLittleEndian(T src, uchar *dest)
T qToLittleEndian(T src)
Para demostrar el uso, considere un ejemplo con una unión para observar los bytes individuales:
union DatosEnteros {
int valor;
char bytes[4];
};
DatosEnteros original, convertido;
original.valor = 0x61626364; // 'abcd' en ASCII
convertido.valor = qFromBigEndian(original.valor);
qDebug() << original.bytes[0] << original.bytes[1] << original.bytes[2] << original.bytes[3];
qDebug() << convertido.bytes[0] << convertido.bytes[1] << convertido.bytes[2] << convertido.bytes[3];
En un sistema little-endian, esto imprimiría "d c b a" seguido de "a b c d", mostrando la conversión. Las funciones como qToBigEndian() realizan conversiones similares, adaptándose al entorno de ejecución.