我已经编写了一个函数来进行转换,但是它有一个错误:输入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 ";
}
}
我提出另一种解决办法,较短。
#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 ";
}
}