如何在Javascript中将十六进制字符串转换为字节并将字节转换为十六进制字符串?

14

如何在JavaScript中将表示为字符串的十六进制代码转换为字节,以及反向转换?

var conv = require('binstring');
var hexstring ='80';
var bytestring = conv(hexstring, {in:'hex', out:'utf8'});
var backtohexstring = conv(bytestring, {in:'utf8', out:'hex'}); // != '80'???

backtohexstring函数将传入的数据字符串解码为正确的十六进制(我使用utf8而不是byte,因为它在控制台打印时看起来像传入的字符串),所以我感到困惑...

我还发现了这两个原生的JavaScript函数,解码器可以处理我的传入流,但我仍然无法获得十六进制编码...

function encode_utf8( s ) {
  return unescape( encodeURIComponent( s ) );
}
function decode_utf8( s ) {
  return decodeURIComponent( escape( s ) );
}

我不确定我理解了,您是否期望得到像 5648 这样的字节串? - adeneo
没有一个字节。我不确定我应该在这里如何表示它... - user626963
2个回答

33

这是一个针对node.js的特殊方法,利用了node标准库提供的Buffer类。

https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings

获取字节(0-255)值的方法:

Buffer.from('80', 'hex')[0];
// outputs 128

并转换回去:

Buffer.from([128]).toString('hex');
// outputs '80'

转换为utf8:

Buffer.from('80', 'hex').toString('utf8');

这对多个十六进制值有效吗?(实际上,我有几个组成字符串的十六进制值) - user626963
当然可以。它可以处理任意长度的十六进制编码字符串。您可以使用[n]符号获取每个位置上的字节,并且可以通过.toString('utf8')将整个字符串转换为utf8表示形式。 - Ben Taber
2
自从Node.js 6.0.0版本以后,new Buffer(size)已经被弃用。请使用Buffer.alloc(16, 'hex').toString('utf8')代替。 - Ryan Wu
UTF8使用安全吗?理想情况下,我们希望有MySQL的unhex()函数的等效功能。因此,“F1F2F3F4”变为0xF1F2F3F4。仅限于Latin1或Binary的00-FF。超过8位的任何内容都是下一层。 - mckenzm

6
你可以利用Number.prototype.toStringparseInt
关键是利用radix参数来为您进行转换。
var bytestring = Number('0x' + hexstring).toString(10);    // '128'
parseInt(bytestring, 2).toString(16);  // '80'


1
字节不等于二进制,所以不是我需要的。 - user626963
2
哎呀,我知道现在已经很晚了,但是我已经修复了parseInt函数,现在它可以将数字转换为十进制而不是二进制了。感谢那位好心的陌生人给我点踩,让我注意到这个问题! - thgaskell
这仍然是不正确的。十六进制 'hex string' 是16进制。此外,使用这些方法无法获取真正的字节。在浏览器和节点中它返回一个字符串并且操作整数。也许,使用新的 Int8Array 类型数组是可能的。未经测试。 parseInt('0x80', 16); // 128(128).toString(16); // '80' - gtzilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接