【问题标题】:How to compress an hexadecimal number into a short string?如何将十六进制数压缩成短字符串?
【发布时间】:2017-03-21 03:43:44
【问题描述】:

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

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

假设示例:0x874FAB41900C -> "ÚΔЂ" -> 0x874FAB41900C。

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

function hexToString(hex) {
    for (var i=0; i < hex.length; i++) {
        // convert the digits into UFT-16
    }

    return string;
}

function stringToHex(string) {
    for (var i=0; i < string.length; i++) {
        // convert the char back into hex values
    }

    return hex;
}

知道怎么做吗?

【问题讨论】:

  • 如果你担心内存大小,你可以使用 Uint8Array
  • 我不关心内存大小,我只需要一个更容易复制/过去的 short 字符串。
  • 发现不错的功能:gist.github.com/Prinzhorn/2628611

标签: javascript encoding hex compression converter


【解决方案1】:

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

function hexToString(hex) {
  hex = hex.substring(2) // remove the '0x' part
  var string = ""

  while (hex.length % 4 != 0) { // we need it to be multiple of 4
    hex =  "0" + hex;
  }

  for (var i = 0; i < hex.length; i+= 4){
    string += String.fromCharCode(parseInt(hex.substring(i,i + 4), 16)) // get char from ascii code which goes from 0 to 65536
  }

  return string;
}

function stringToHex(string) {
  var hex = ""
  for (var i=0; i < string.length; i++) {
    hex += ( (i == 0 ? "" : "000") + string.charCodeAt(i).toString(16)).slice(-4) // get character ascii code and convert to hexa string, adding necessary 0s
  }

  return '0x' + hex.toUpperCase();
}



var str = hexToString("0x874FAB41900C")
console.log(str)
console.log(stringToHex(str))

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

function hexToString(hex) {
  hex = hex.substring(2) // remove the '0x' part
  var string = ""

  while (hex.length % 8 != 0) { // we need it to be multiple of 8
    hex =  "0" + hex;
  }

  for (var i = 0; i < hex.length; i+= 8){
    string += String.fromCharCode(parseInt(hex.substring(i,i + 4), 16), parseInt(hex.substring(i + 4,i + 8), 16))
  }

  return string;
}

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

编辑:一个有趣的例子

function hexToString(hex) {
  hex = hex.substring(2) // remove the '0x' part
  var string = ""

  while (hex.length % 8 != 0) { // we need it to be multiple of 8
    hex =  "0" + hex;
  }

  for (var i = 0; i < hex.length; i+= 8){
    string += String.fromCharCode(parseInt(hex.substring(i,i + 4), 16), parseInt(hex.substring(i + 4,i + 8), 16))
  }

  return string;
}

console.log(hexToString("0xD83DDCA3"))

【讨论】:

  • 太棒了,谢谢!但是有没有办法让字符串更短?喜欢使用 UFT-32?
  • @Thomas 添加了 32 位版本
  • @Thomas 这里是 20 位版本,确实减少了使用的字符数量,这是你能做的最好的:jsfiddle.net/11t7h8ho
  • @juvian 2017 年疯狂科学家奖的代码有什么更新吗?
  • @DeerSpotter 添加了另一个示例
猜你喜欢
  • 1970-01-01
  • 2010-12-31
  • 2012-07-31
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
相关资源
最近更新 更多