2016-02-16 2 views
1

Следующий код (на C++) должен получить некоторые данные вместе с его размером (в байтах) и вернуть строку, содержащую шестнадцатеричный код. size - размер блока памяти с его местоположением, хранящимся в val.Почему функция показывает шестнадцатеричный код в обратном порядке?

std::string byteToHexString(const unsigned char* val, unsigned long long size) 
{ 
    unsigned char temp; 
    std::string vf; 
    vf.resize(2 * size+1); 
    for(unsigned long long i= 0; i < size; i++) 
    { 
     temp = val[i]/16; 
     vf[2*i] = (temp <= 9)? '0' + temp: 'A' + temp - 10; // i.e., (10 = 9 + 1) 
     temp = val[i] % 16; 

     vf[2*i+1] = (temp <= 9)? '0' + temp: 'A' + temp - 10; // i.e., (10 = 9 + 1) 
    } 

vf[2*size] = '\0'; 
return (vf); 
} 

Так на выполнение вышеуказанной функции следующим образом:

int main() 
{ 
    unsigned int a = 5555; 
    std::cout << byteToHexString((unsigned char*)(&a), 4); 
    return 0; 
} 

Выход мы получаем это:

B3150000 

Не следует вывод, а быть 000015B3? Так почему это отображение в обратном порядке? Что-то не так с кодом (я использую компилятор g ++ в Ubuntu)?

ответ

3

Вы видите порядок хранения байтов для представления целых чисел в вашей архитектуре, который является little-endian. Это означает, что младший байт приходит первым.

Если вы хотите, чтобы отобразить его в обычном цифровом виде, вам необходимо либо обнаружить порядка байтов вашей архитектуры и переключите код соответственно, или просто использовать строку потока:

unsigned int a = 5555; 
std::ostringstream ss; 
ss << std::setfill('0') << std::setw(sizeof(a)*2) << std::hex << a; 
std::cout << ss.str() << std::endl; 
+0

Является ли эта архитектура платформы специфичным или специфический компилятор? Извините за этот глупый вопрос ... – Sreram

+0

Это характерная для архитектуры. В наши дни большинство компьютеров общего назначения малоподвижны. Обратите внимание, что компилятор знает, на какую архитектуру нацеливается, и поэтому во время компиляции можно проверить проверку подлинности. – paddy

Смежные вопросы