如何将十六进制数压缩为短字符串?

Tho*_*mas 2 javascript compression encoding hex converters

我有一个长度未知的十六进制数,我想将其转换为尽可能短的字符串。稍后能够将新字符串转换回原始数字。

\n\n

由于每个数字只有 4 位,我想将数字转换为 UFT-16 或 UFT-32 字符串。这将创建一个带有奇怪字符的短字符串。

\n\n

假设示例:0x874FAB41900C ->“\xc3\x9a\xce\x94\xd0\x82” -> 0x874FAB41900C。

\n\n

所以我正在寻找的是两个像这样的 Javascript 函数:

\n\n
function hexToString(hex) {\n    for (var i=0; i < hex.length; i++) {\n        // convert the digits into UFT-16\n    }\n\n    return string;\n}\n\nfunction stringToHex(string) {\n    for (var i=0; i < string.length; i++) {\n        // convert the char back into hex values\n    }\n\n    return hex;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

知道如何做到这一点吗?

\n

juv*_*ian 6

在 js 中,字符串字符使用 16 位,因此我们可以将 4 个十六进制字符打包在 1 中:

\n\n

\r\n
\r\n
function hexToString(hex) {\r\n  hex = hex.substring(2) // remove the \'0x\' part\r\n  var string = ""\r\n\r\n  while (hex.length % 4 != 0) { // we need it to be multiple of 4\r\n    hex =  "0" + hex;\r\n  }\r\n\r\n  for (var i = 0; i < hex.length; i+= 4){\r\n    string += String.fromCharCode(parseInt(hex.substring(i,i + 4), 16)) // get char from ascii code which goes from 0 to 65536\r\n  }\r\n\r\n  return string;\r\n}\r\n\r\nfunction stringToHex(string) {\r\n  var hex = ""\r\n  for (var i=0; i < string.length; i++) {\r\n    hex += ( (i == 0 ? "" : "000") + string.charCodeAt(i).toString(16)).slice(-4) // get character ascii code and convert to hexa string, adding necessary 0s\r\n  }\r\n\r\n  return \'0x\' + hex.toUpperCase();\r\n}\r\n\r\n\r\n\r\nvar str = hexToString("0x874FAB41900C")\r\nconsole.log(str)\r\nconsole.log(stringToHex(str))
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

如果您想要 32 位版本,则需要更改编码版本,解码保持不变。请注意,只有最多 21 位的 unicode 字符,因此不要认为您可以比 16 位字符做得更好,这个字符不会真正用更少的字符来实现:

\n\n
function hexToString(hex) {\n  hex = hex.substring(2) // remove the \'0x\' part\n  var string = ""\n\n  while (hex.length % 8 != 0) { // we need it to be multiple of 8\n    hex =  "0" + hex;\n  }\n\n  for (var i = 0; i < hex.length; i+= 8){\n    string += String.fromCharCode(parseInt(hex.substring(i,i + 4), 16), parseInt(hex.substring(i + 4,i + 8), 16))\n  }\n\n  return string;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以在此处阅读有关 32 位的更多信息:how to render 32bit unicodecharacters in google v8 (and nodejs)

\n\n

编辑:一个有趣的例子

\n\n

\r\n
\r\n
function hexToString(hex) {\n  hex = hex.substring(2) // remove the \'0x\' part\n  var string = ""\n\n  while (hex.length % 8 != 0) { // we need it to be multiple of 8\n    hex =  "0" + hex;\n  }\n\n  for (var i = 0; i < hex.length; i+= 8){\n    string += String.fromCharCode(parseInt(hex.substring(i,i + 4), 16), parseInt(hex.substring(i + 4,i + 8), 16))\n  }\n\n  return string;\n}\n
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

  • 太好了,谢谢!但是有没有办法让字符串变得更短呢?喜欢使用 UFT-32 吗? (2认同)