代码之家  ›  专栏  ›  技术社区  ›  ilya1725

在Google工作表中将二进制数据转换为十六进制

  •  1
  • ilya1725  · 技术社区  · 7 年前

    c0a80123000006150000000180004203 .

    在谷歌表单中有没有办法将这个二进制数转换成十六进制字符串。我要找的东西是: BIN2HEX(data[0]) = "0xc0" BIN2HEX 无法工作,因为数据太大,无法处理。

    Raw text sample file . Converted google sheet .


    function extractip(binary_data) {
      var blob = Utilities.newBlob(binary_data);
      var ip1 = blob.getBytes()[0];
      var ip2 = blob.getBytes()[1];
      var ip3 = blob.getBytes()[2];
      var ip4 = blob.getBytes()[3];
      
      return Utilities.formatString("%u.%u.%u.%u", ip1, ip2, ip3, ip4);
    }

    二进制blob中的前4个字节表示IP地址,在所附示例中为192.168.0.X。然而,输出返回类似于 -17.-65.-67.-17 .

    1 回复  |  直到 7 年前
        1
  •  0
  •   Tanaike    7 年前

    这次修改怎么样?

    在GoogleApps脚本中,由 Utilities.newBlob(data).getBytes() 是有符号十六进制的字节数组。需要将字节数组转换为无符号十六进制。

    修改脚本:

    function extractip(binary_data) {
      var byteAr = Utilities.newBlob(binary_data).getBytes();
      return byteAr.map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");
    }
    

    注:

    • 例如,当您使用此选项时,请将 =extractip(G2)

    编辑:

    如果您想直接检索十进制数,如 192.168.0.X ,请修改如下。这是一个示例修改。所以请根据你的情况修改它。

    return byteAr.map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");
    

    致:

    return byteAr.map(function(e) {return e < 0 ? e + 256 : e}).join(",");