二进制到十六进制的转换不起作用
Binary to hexadecimal conversion does not work
尝试将二进制转换为十六进制时,我在 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++ 版本有什么问题?为什么它们会产生不同的结果?
hex
值将取决于所述字符串的编码。 PHP 假设它是 UTF-8。 ES 将字符串定义为 UTF-16:
primitive value that is a finite ordered sequence of zero or more 16-bit unsigned integer
NOTE A String value is a member of the String type. Each integer value in the sequence usually represents a single 16-bit unit of UTF-16 text. However, ECMAScript does not place any restrictions or requirements on the values except that they must be 16-bit unsigned integers.
因此它可以与 UTF-16 一起工作(UCS-2 也是 16 位但不允许使用代理访问其他平面)。
无论如何,¬
的 UTF-16 十六进制表示是 00AC
。这就是为什么你得到 AC
。我不知道 C++,但我的猜测是每个字符也被视为 UTF-16(或 UCS2)。
这是我写的一个从十六进制到整数的转换器,要将十六进制字符串转换为整数,你实际上只需要做相反的事情,或多或少。如果你愿意,我可以编写一个从整数到十六进制字符串的转换器:)
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] != '[=10=]')
{
lTemp += HexaDigitToDecimalDigit(pchHexStr[i]) * lMultiPlier;
i++;
lMultiPlier *= 16;
}
return lTemp;
}
尝试将二进制转换为十六进制时,我在 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++ 版本有什么问题?为什么它们会产生不同的结果?
hex
值将取决于所述字符串的编码。 PHP 假设它是 UTF-8。 ES 将字符串定义为 UTF-16:
primitive value that is a finite ordered sequence of zero or more 16-bit unsigned integer
NOTE A String value is a member of the String type. Each integer value in the sequence usually represents a single 16-bit unit of UTF-16 text. However, ECMAScript does not place any restrictions or requirements on the values except that they must be 16-bit unsigned integers.
因此它可以与 UTF-16 一起工作(UCS-2 也是 16 位但不允许使用代理访问其他平面)。
无论如何,¬
的 UTF-16 十六进制表示是 00AC
。这就是为什么你得到 AC
。我不知道 C++,但我的猜测是每个字符也被视为 UTF-16(或 UCS2)。
这是我写的一个从十六进制到整数的转换器,要将十六进制字符串转换为整数,你实际上只需要做相反的事情,或多或少。如果你愿意,我可以编写一个从整数到十六进制字符串的转换器:)
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] != '[=10=]')
{
lTemp += HexaDigitToDecimalDigit(pchHexStr[i]) * lMultiPlier;
i++;
lMultiPlier *= 16;
}
return lTemp;
}