提问者:小点点

dec到十六进制转换函数中带有小endpoint的错误


我已经编写了一个函数来进行转换,但是它有一个错误:输入1000给出了E8 E3的little endian,或者E3E8的十六进制,但是它应该是03E8,或者E8 03的little endian格式。 我一点也不知道哪里出了问题。

我知道这个代码可能很大,但是我真的很想知道这个错误是怎么回事,所有其他的数字都可以正常工作,即使是负数

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

共2个答案

匿名用户

我提出另一种解决办法,较短。

#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;
}

匿名用户

缺少一个需要将旧c1设置为“0”ascii的其他项,傻我:)

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