Javascript node.js中的缓冲区和URL编码

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

如何在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'
> 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会更好。请尝试以下答案: