JavaScript中的Unhexlify不适用于重音

bn31dyow  于 2023-05-16  发布在  Java
关注(0)|答案(2)|浏览(186)

长话短说,我正在将Excel文件从Python发送到Javascript。要做到这一点,我需要将其作为字符串发送(非常脏,但这是我这边的一个约束),所以,我“hexlify”(或使用.hex(),任何方法都可以,只要它在Javascript中工作)我的Excel文件在Python中并将其发送到Javascript。

with open(EXCEL_TEMPLATE_OUTPUTS, "rb") as f:
        encrypted_bytes = f.read()
    
    return encrypted_bytes.hex()

现在的困难是将它转换回JavaScript中的字节数组,以便我可以创建一个Blob。为此,我使用下面的函数:

var unhexlify = function(str) {
var bytes = [];
for (var i=0, l=str.length; i<l; i+=2) {
  bytes.push(String.fromCharCode(parseInt(str.substr(i, 2), 16)));
}
return bytes;

除了一些字符,它的工作相当不错。例如,“c8”被转换为“”而不是“\xc8”。我重建的文件被破坏了。有没有办法克服这个问题?
编辑:下面是一个突出问题的例子:

console.log(String.fromCharCode(parseInt("c8", 16)));

正如你所看到的,它发送的是“”而不是“\xc8”,而在Python中:

from binascii import hexlify, unhexlify
unhexlify("c8")
# b'\xc8'
bytes.fromhex('c8')
# b'\xc8'
xqnpmsa8

xqnpmsa81#

我终于找到了一个解决方案,它实际上摆脱了String.fromCharCode()。这里的想法是从Python发送的十六进制创建一个Uint 8Array:

var typedArray = new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function (h) {return parseInt(h, 16)}))

然后我可以基于这个Uint 8Array创建一个blob:

const blob = new Blob([typedArray], { type: "application/octet-stream" });

谢谢@Konrad。你引导我走上了正确的道路,找到了解决方案!

oogrdqng

oogrdqng2#

可能在编码期间错误在str.padStart(2,'0')码中。或者你可以指定一些你想要解码的十六进制

var hexlify = function(str){
   return [...str].map(e => 
       e.charCodeAt(0).toString(16)
         .padStart(2, '0') // a -> 0a
      ).join('')
}
var unhexlify = function(str) {
   return String.fromCharCode(...
     str.match(/.{1,2}/g) // ['68','65','6c','6c','6f']
     .map(e => parseInt(e, 16))
     )
}
console.log(hexlify('hello'), unhexlify('68656c6c6f')) // 68656c6c6f hello

相关问题