0

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 ";
    }
}
  • https://stackoverflow.com/questions/5100718/integer-to-hex-string-in-c – Ihor Drachuk Jul 31 '20 at 13:09
  • Btw I know the code might be messy and not logical at some points, but it has a certain purpose in a much larger project. – Anoniman Anoniman Jul 31 '20 at 13:18
  • 1
    If the code has a purpose in a larger project, then that's even MORE of a reason to make sure it's logical and clean. Step through with your debugger, watch the variables you care about, and find out when they deviate from your expected value. – JohnFilleau Jul 31 '20 at 13:22
  • Specifically look at what happens at the line `if (num != 0) {` Instead of handling the number in two-char chunks, I'd handle it one char at a time. Then, if you need spaces, insert those AFTER the number has been constructed. – JohnFilleau Jul 31 '20 at 13:25
  • Nevermind I found the error, was too lazy to debug it. – Anoniman Anoniman Jul 31 '20 at 13:25
  • Use a table, `const char digits[] = "0123456789ABCDEF;"`, and you can get the least significant digit with `digits[x%16]`. That saves you something like 90% of the code. – molbdnilo Jul 31 '20 at 13:31

2 Answers2

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 ";
    }
}
0

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;
}
Ihor Drachuk
  • 1,265
  • 7
  • 17