简体   繁体   English

dec 到十六进制转换 function 时出现小端错误

[英]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.我写了一个 function 来进行转换,但它有一个错误:输入 1000 将 E8 E3 作为小端或 E3E8 作为十六进制,但它应该是小端格式的 03E8 或 E8 03。 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:)缺少需要将旧 c1 设置为 '0' ascii 的 else,我很傻:)

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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