简体   繁体   中英

Error in dec to hex converting function with little endian

I've written a function that does the conversion, but it has an error: 1000 as input gives E8 E3 as little endian, or E3E8 as hex, but it should be 03E8, or E8 03 in little endian format. I literally don't have a clue what might be wrong.

I know the code might be pretty big for it's purpose, but I'd really like to know what's wrong with the error, all other numbers work fine, even negative ones

string decToHex(int num) {
    string ret = ""; 
    char c1='0', c2='0';
    int res; 
    if(num>0){
    while (num != 0) {
        res = num % 16;
        num = num / 16;
        switch (res) {
        case 0: c2 = '0'; break;
        case 1: c2 = '1'; break;
        case 2: c2 = '2'; break;
        case 3: c2 = '3'; break;
        case 4: c2 = '4'; break;
        case 5: c2 = '5'; break;
        case 6: c2 = '6'; break;
        case 7: c2 = '7'; break;
        case 8: c2 = '8'; break;
        case 9: c2 = '9'; break;
        case 10: c2 = 'A'; break;
        case 11: c2 = 'B'; break;
        case 12: c2 = 'C'; break;
        case 13: c2 = 'D'; break;
        case 14: c2 = 'E'; break;
        case 15: c2 = 'F'; break;
        }
        if (num != 0) {
            res = num % 16;
            num = num / 16;
            switch (res) {
            case 0: c1 = '0'; break;
            case 1: c1 = '1'; break;
            case 2: c1 = '2'; break;
            case 3: c1 = '3'; break;
            case 4: c1 = '4'; break;
            case 5: c1 = '5'; break;
            case 6: c1 = '6'; break;
            case 7: c1 = '7'; break;
            case 8: c1 = '8'; break;
            case 9: c1 = '9'; break;
            case 10: c1 = 'A'; break;
            case 11: c1 = 'B'; break;
            case 12: c1 = 'C'; break;
            case 13: c1 = 'D'; break;
            case 14: c1 = 'E'; break;
            case 15: c1 = 'F'; break;
            }
        }
        ret += c1; 
        ret += c2; ret += " ";
        

    }

    return ret;
    }
    else if(num<0){
        unsigned int n = num;
        while (n != 0) {
            res = n % 16;
            n = n / 16;
            switch (res) {
            case 0: c2 = '0'; break;
            case 1: c2 = '1'; break;
            case 2: c2 = '2'; break;
            case 3: c2 = '3'; break;
            case 4: c2 = '4'; break;
            case 5: c2 = '5'; break;
            case 6: c2 = '6'; break;
            case 7: c2 = '7'; break;
            case 8: c2 = '8'; break;
            case 9: c2 = '9'; break;
            case 10: c2 = 'A'; break;
            case 11: c2 = 'B'; break;
            case 12: c2 = 'C'; break;
            case 13: c2 = 'D'; break;
            case 14: c2 = 'E'; break;
            case 15: c2 = 'F'; break;
            }
            if (n != 0) {
                res = n % 16;
                n = n / 16;
                switch (res) {
                case 0: c1 = '0'; break;
                case 1: c1 = '1'; break;
                case 2: c1 = '2'; break;
                case 3: c1 = '3'; break;
                case 4: c1 = '4'; break;
                case 5: c1 = '5'; break;
                case 6: c1 = '6'; break;
                case 7: c1 = '7'; break;
                case 8: c1 = '8'; break;
                case 9: c1 = '9'; break;
                case 10: c1 = 'A'; break;
                case 11: c1 = 'B'; break;
                case 12: c1 = 'C'; break;
                case 13: c1 = 'D'; break;
                case 14: c1 = 'E'; break;
                case 15: c1 = 'F'; break;
                }
            }
            ret += c1;
            ret += c2; ret += " ";
        }
        return ret;
    }
    else {
        return "00 00 ";
    }
}

I propose alternative solution, shorter.

#include <iostream>
#include <string>


template <typename I> std::string n2hexstr(I w, int hex_len = sizeof(I)<<1) {
    static const char* const digits = "0123456789ABCDEF";
    std::string rc(hex_len,'0');

    auto it = rc.begin();
    for (int i = 0; i < hex_len; i++) {
        *it++ = digits[(w >> (i*8 + 4)) & 0x0F];
        *it++ = digits[(w >> (i*8)) & 0x0F];
    }

    return rc;
}


int main()
{
    std::cout << n2hexstr( static_cast<uint16_t>(1000) ) << std::endl;
    return 0;
}

Was missing an else that needed to set the old c1 to '0' ascii, silly me:)

string decToHex(int num) {
    string ret = ""; 
    char c1='0', c2='0';
    int res; 
    if(num>0){
    while (num != 0) {
        res = num % 16;
        num = num / 16;
        switch (res) {
        case 0: c2 = '0'; break;
        case 1: c2 = '1'; break;
        case 2: c2 = '2'; break;
        case 3: c2 = '3'; break;
        case 4: c2 = '4'; break;
        case 5: c2 = '5'; break;
        case 6: c2 = '6'; break;
        case 7: c2 = '7'; break;
        case 8: c2 = '8'; break;
        case 9: c2 = '9'; break;
        case 10: c2 = 'A'; break;
        case 11: c2 = 'B'; break;
        case 12: c2 = 'C'; break;
        case 13: c2 = 'D'; break;
        case 14: c2 = 'E'; break;
        case 15: c2 = 'F'; break;
        }
        if (num != 0) {
            res = num % 16;
            num = num / 16;
            switch (res) {
            case 0: c1 = '0'; break;
            case 1: c1 = '1'; break;
            case 2: c1 = '2'; break;
            case 3: c1 = '3'; break;
            case 4: c1 = '4'; break;
            case 5: c1 = '5'; break;
            case 6: c1 = '6'; break;
            case 7: c1 = '7'; break;
            case 8: c1 = '8'; break;
            case 9: c1 = '9'; break;
            case 10: c1 = 'A'; break;
            case 11: c1 = 'B'; break;
            case 12: c1 = 'C'; break;
            case 13: c1 = 'D'; break;
            case 14: c1 = 'E'; break;
            case 15: c1 = 'F'; break;
            }
        }
       else c1='0';
        ret += c1; 
        ret += c2; ret += " ";
        

    }

    return ret;
    }
    else if(num<0){
        unsigned int n = num;
        while (n != 0) {
            res = n % 16;
            n = n / 16;
            switch (res) {
            case 0: c2 = '0'; break;
            case 1: c2 = '1'; break;
            case 2: c2 = '2'; break;
            case 3: c2 = '3'; break;
            case 4: c2 = '4'; break;
            case 5: c2 = '5'; break;
            case 6: c2 = '6'; break;
            case 7: c2 = '7'; break;
            case 8: c2 = '8'; break;
            case 9: c2 = '9'; break;
            case 10: c2 = 'A'; break;
            case 11: c2 = 'B'; break;
            case 12: c2 = 'C'; break;
            case 13: c2 = 'D'; break;
            case 14: c2 = 'E'; break;
            case 15: c2 = 'F'; break;
            }
            if (n != 0) {
                res = n % 16;
                n = n / 16;
                switch (res) {
                case 0: c1 = '0'; break;
                case 1: c1 = '1'; break;
                case 2: c1 = '2'; break;
                case 3: c1 = '3'; break;
                case 4: c1 = '4'; break;
                case 5: c1 = '5'; break;
                case 6: c1 = '6'; break;
                case 7: c1 = '7'; break;
                case 8: c1 = '8'; break;
                case 9: c1 = '9'; break;
                case 10: c1 = 'A'; break;
                case 11: c1 = 'B'; break;
                case 12: c1 = 'C'; break;
                case 13: c1 = 'D'; break;
                case 14: c1 = 'E'; break;
                case 15: c1 = 'F'; break;
                }
            }
           else c1='0';
            ret += c1;
            ret += c2; ret += " ";
        }
        return ret;
    }
    else {
        return "00 00 ";
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM