Manejo de Cadenas y Conversiones de Endianness en Qt

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.

Etiquetas: Qt C++ QByteArray endian hexadecimal

Publicado el 7-3 17:04