Javascript node.js中的缓冲区和URL编码
如何在node.js中对缓冲区进行url解码和url编码?我有以url编码的形式输入的密文字节,我需要对它们进行解码和解密,因此缓冲区不能保证包含所有标准UTF-8字符 以下是我尝试过的,但解码结果与原始结果不匹配:Javascript node.js中的缓冲区和URL编码,javascript,node.js,Javascript,Node.js,如何在node.js中对缓冲区进行url解码和url编码?我有以url编码的形式输入的密文字节,我需要对它们进行解码和解密,因此缓冲区不能保证包含所有标准UTF-8字符 以下是我尝试过的,但解码结果与原始结果不匹配: > foo = Buffer.from('deadbeef', 'hex') <Buffer de ad be ef> > fooEnc = encodeURIComponent(foo) '%DE%AD%EF%BF%BD%EF%BF%BD' > fo
> foo = Buffer.from('deadbeef', 'hex')
<Buffer de ad be ef>
> fooEnc = encodeURIComponent(foo)
'%DE%AD%EF%BF%BD%EF%BF%BD'
> fooDec = decodeURIComponent(fooEnc)
'ޭ��'
> Buffer.from(fooDec).toString('hex')
'deadefbfbdefbfbd'
以下是我提出的一些函数,用于在url编码和任何字节值(包括非标准utf8)的缓冲区之间进行转换:
const isUrlSafe = (char) => {
return /[a-zA-Z0-9\-_~.]+/.test(char)
}
const urlEncodeBytes = (buf) => {
let encoded = ''
for (let i = 0; i < buf.length; i++) {
const charBuf = Buffer.from('00', 'hex')
charBuf.writeUInt8(buf[i])
const char = charBuf.toString()
// if the character is safe, then just print it, otherwise encode
if (isUrlSafe(char)) {
encoded += char
} else {
encoded += `%${charBuf.toString('hex').toUpperCase()}`
}
}
return encoded
}
const urlDecodeBytes = (encoded) => {
let decoded = Buffer.from('')
for (let i = 0; i < encoded.length; i++) {
if (encoded[i] === '%') {
const charBuf = Buffer.from(`${encoded[i + 1]}${encoded[i + 2]}`, 'hex')
decoded = Buffer.concat([decoded, charBuf])
i += 2
} else {
const charBuf = Buffer.from(encoded[i])
decoded = Buffer.concat([decoded, charBuf])
}
}
return decoded
}
示例:
> const buf = Buffer.from('4142432b', 'hex')
> const encoded = urlEncodeBytes(buf)
'ABC%2B'
> const encoded = 'ABC%2B'
> const buf = urlDecodeBytes(encoded)
<Buffer 41 42 43 2b>
函数encodeURIComponent是为字符串定义的。为什么你需要它作为缓冲?你不能只使用原始的“deadbeef”字符串吗?deadbeef是十六进制编码的,就像我说的,我期望的数据不是标准的UTF-8,所以我不能使用字符串,例如0xdeadbeef将是��'. 另请参见编辑。这是我的问题:为什么不使用十六进制编码或base64?哦,我明白了,是的,这是一个很好的问题!不幸的是,我无法访问发送数据的代码,因此我无法更改接收到的数据的格式。Base64会更好。请尝试以下答案: