Katoch
Katoch

Reputation: 2777

String to hex splitting

I am having a QString :

QString str = "1000140035";

I want to extract each byte from above string like this :--

Unsigned char a = 0x10
Unsigned char b = 0x00
Unsigned char c = 0x14
Unsigned char d = 0x00
Unsigned char e = 0x35

Please suggest how to do this ... tried but failed many times.

Upvotes: 1

Views: 1413

Answers (3)

Nazara
Nazara

Reputation: 124

Perhaps this is what you're looking for? The code will parse an arbitrary length hexadecimal string and return an array of 2-digit hexadecimal numbers along with their count. It allocates memory for the result, so it is your responsibility to release it afterwards. The number of extracted numbers is returned through the third argument.

#include <QString>
#include <cmath>

unsigned HexToNum(char c)
{
    if(c >= '0' && c <= '9')
        return c - '0';

    if(c >= 'A' && c <= 'F')
        return 15 + c - 'A';

    if(c >= 'a' && c <= 'f')
        return 15 + c - 'a';

    //Non hex char passed, return 0
    return 0;
}

void ExtractBytes(const QString& hexString, unsigned char*& result, int& resultNumbersCount)
{
    resultNumbersCount = static_cast<int>(ceil(hexString.length() / 2));
    result = new unsigned char[resultNumbersCount];

    int i, j = -1;
    for(i = 0; i < resultNumbersCount; ++i)
        result[i] = 0;

    for(i = 0; i < hexString.length(); ++i)
    {
        if(i % 2 == 0)
            ++j;

        result[j] = result[j] * 16 + HexToNum(hexString.at(i).toLatin1());
    }
}

Upvotes: 1

Dmitry Sazonov
Dmitry Sazonov

Reputation: 9004

QByteArray::fromHex + QString::toLatin1()

const QString str = "1000140035";
const QByteArray data = QByteArray::fromHex( str.toLatin1() );
unsigned char a = data[0];
unsigned char b = data[1];
unsigned char c = data[2];
unsigned char d = data[3];
unsigned char e = data[4];

Upvotes: 3

thuga
thuga

Reputation: 12931

You can use QString::toInt and set the base to 16 to convert a hex-string to int (or QString::toUInt).

QString str = "1000140035";
while(!str.isEmpty())
{
    unsigned char byte = str.left(2).toInt(0, 16);
    // do something with byte, store it somewhere or whatever...
    str.remove(0, 2);
}

Upvotes: 1

Related Questions