二进制到十六进制转换不起作用

时间:2015-10-19 12:36:00

标签: javascript php c++ binary hex

当尝试将二进制转换为十六进制时,我在JavaScript和C ++中得到错误的结果。

这是我的PHP代码:

$f = bin2hex("l¬");
echo $f;

输出

6cc2ac

在JavaScript中,我使用此功能:

function bin2hex(s){
var i,f =s.length, a =[];
for(i =0;i<f;i++){
a[i] = s.charCodeAt(i).toString(16);
}
 return a.join('');
}

输出

6cac

这是C ++代码:

std::string bin2hex(const std::string& s)
{
  const static char bin2hex_lookup[] = "0123456789abcdef";
  unsigned int t=0,i=0,leng=s.length();
  std::stringstream r;
  for(i=0; i<leng; i++)
  {
    r << bin2hex_lookup[ s[i] >> 4 ];
    r << bin2hex_lookup[ s[i] & 0x0f ];
  }
  return r.str();
}

使用

调用该函数
cout << bin2hex("l¬") << endl;

打印

6c c

JavaScript和C ++版本有什么问题?为什么它们产生不同的结果?

2 个答案:

答案 0 :(得分:1)

hex值取决于所述字符串的编码。 PHP假设它是UTF-8。 ES将字符串定义为UTF-16:

  

原始值,它是零或更多16位无符号整数的有限有序序列

     

注意String值是String类型的成员。序列中的每个整数值通常表示单个16位UTF-16文本单元。但是,ECMAScript不会对值赋予任何限制或要求,除非它们必须是16位无符号整数。

因此它可以使用UTF-16(UCS-2也是16位但不允许使用代理来访问其他平面)。

无论如何,¬的UTF-16十六进制表示为00AC。这就是你得到AC的原因。我不知道C ++,但我的猜测是每个角色也被视为UTF-16(或UCS2)。

答案 1 :(得分:1)

我主要编写宏和一些用于转换它们的函数。这真的不是很难,如果输入和输出是固定宽度(33位,64位),它会变得更加容易

每个4位对对应一个十六进制字符,1111 = f。

也许可以使用。

如果我稍稍投票,我会为你写一个免费的转换器:)

她是十六进制到十进制(不是str)

long HexaDigitToDecimalDigit(char ch)
{

    switch(ch) {
        case '0': return 0;  break;     case '1': return 1;  break;
        case '2': return 2;  break;     case '3': return 3;  break;
        case '4': return 4;  break;     case '5': return 5;  break;
        case '6': return 6;  break;     case    '7': return 7;  break;
        case '8': return 8;  break;     case '9': return 9;  break;
        case 'A': return 10;  break     case 'B': return 11;  break
        case 'C': return 12;  break
        case 'D': return 13;  break     case 'E': return 14;  break
        case 'F': return 15;  break
        default:return 0;   }

}

// Hexstrings are normal /0 terminated strings
long HexToDec(char* pchHexStr) 
{
    long lTemp = 0;
    long lMultiPlier = 1;

    int i = 0;

    while (pchHexStr[i] != '\0')
    {
        lTemp += HexaDigitToDecimalDigit(pchHexStr[i]) * lMultiPlier;
        i++;
        lMultiPlier *= 16;
    }

    return lTemp;
}