Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
二进制到十六进制的转换不起作用 当试图把二进制转换成十六进制时,在JavaScript和C++中得到了错误的结果。_Javascript_Php_C++_Binary_Hex - Fatal编程技术网

二进制到十六进制的转换不起作用 当试图把二进制转换成十六进制时,在JavaScript和C++中得到了错误的结果。

二进制到十六进制的转换不起作用 当试图把二进制转换成十六进制时,在JavaScript和C++中得到了错误的结果。,javascript,php,c++,binary,hex,Javascript,Php,C++,Binary,Hex,这是我的PHP代码: $f = bin2hex("l¬"); echo $f; 输出是 6cc2ac 6cac 在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(''); } 这是C++代码: std::string bin2hex(const std

这是我的PHP代码:

$f = bin2hex("l¬");
echo $f;
输出是

6cc2ac
6cac
在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('');
}

这是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();
}

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

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

基元值,它是零或多个16位无符号整数的有限有序序列

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

因此,它可以与UTF-16一起工作(UCS-2也是16位的,但不允许使用代理访问其他平面)


无论如何,
的UTF-16十六进制表示法是
00AC
。这就是为什么您会得到
AC
。我不知道C++,但是我猜每个字符也被当作UTF 16(或者UCS2)。

< P>这是一个从十六进制到整数i的转换器,把十六进制字符串转换成整数,你确实需要做的相反,或多或少。我可以写一个从整数到十六进制字符串的转换器,如果你愿意:)


在C++版本中,令人惊讶的结果是因为<代码> S[i]>4 <代码>不能做到当代码> s[i] < /C>大于127时您所期望的。您应该使用
(unsigned char)(s[i])>>4
。剩下的区别似乎是第二个字符是8位宽还是16位宽。我不知道你是如何创建这个字符的,所以我不能说哪个PHP或JavaScript是错误的。@JSF第二个字符是8位宽还是16位宽。我不知道你是怎么创造这个角色的我读过wavfile@JSF现在C++给我6Cac,就像JavaScript之后,使用你的CODESO JavaScript中的解决方案是什么?现在必须是C2AC,而不是ACIF C++和JS正在获得UTF-16,如果PHP把它当作UTF-16来代替UTF-8会更好吗?我在PHP中有音频波形的项目,它的工作很好,如果我使用UTF-16Maby给我坏波形,我就开始使用NoDE.js,我想把它写在NoDE.js上或者C++上,然后从NoDE.JsWELL中运行它,您需要找到某种将UTF-16转换为UTF8的转换算法。LOL我找到了这个函数^函数toHex(str,hex){try{hex=unescape(encodeURIComponent(str)).split(“”).map(函数(v){return v.charCodeAt(0).toString(16)}.join(“”)}catch(e){hex=str console.log('invalid text input:'+str)}返回十六进制数}
cout << bin2hex("l¬") << endl;
6c c
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;
}