0_o
0_o

Reputation: 33

Getting wrong hex value from read function

Function gets valid data by 1 step, but when go to 2 step gets wrong hex data, what i`m doing wrong?

stringstream getHexFromBuffer(char* buffer,short startFrom = 0, short to = 4)
{
    int len = strlen(buffer);
    stringstream hexValue;
    for (size_t i = startFrom; i < to; i++) {
        hexValue << hex << (int)buffer[i];
    }
    return hexValue;
}

bool big::openFile(std::string fName){
    this->fileName = fName;
    
    ifstream file(fName.c_str(), ios::binary | ios::out | ios::ate);

    char* memblock;

    this->fileSize = file.tellg();

    memblock = new char[16];

    file.seekg(0, ios::beg);

    if (!file.is_open()) {
        file.close();
        throw new exception("Файл не может быть открыт!");
    }
    file.read(memblock, 16);
    string bigCheck = hexToASCII(getHexFromBuffer(memblock).str());

    if (strcmp(bigCheck.c_str(), "BIGF") != 0) {
        throw new exception("Не .BIG архив!");
    }
    this->fileType = bigCheck.c_str();

    string bigSize = getHexFromBuffer(memblock, 4, 8).str();
    //cout << getIntFromHexString(bigSize) << endl << this->fileSize ;

    file.close();
}

First valid attempt

Second not valid attempt

Must be d0998100, but get ffffffd0ffffff99ffffff810 instead

Full hex that i trying to get is 42 49 47 46 D0 99 81 00, maybe it helps

Upvotes: 0

Views: 239

Answers (1)

3CxEZiVlQ
3CxEZiVlQ

Reputation: 38465

d0 is a negative 8 bit value in signed char. This is exact the same negative value ffffffd0 in int. For getting "d0" in output, cast the signed char to another unsigned type of the same size (1 byte) then cast the result to int:

hexValue << hex << (int)(unsigned char)buffer[i];
hexValue << hex << (int)(uint8_t)buffer[i];

The first type cast keeps 8 bits in an unsigned type, a positive number, the second cast makes a positive int.

Upvotes: 1

Related Questions