如何将二进制数据映射到javascript中的字符?

时间:2016-04-11 14:06:29

标签: javascript encoding

对于我正在处理的API,我必须按照这些规则将字节映射到字符:

  • 字节0x20到0x24(含)将映射到相应的字符U + 0020到U + 0024(含)。
  • 字节0x26到0x7E包括映射到相应的字符U + 0026到U + 007E(包括端点)。
  • 其他字节映射到由百分号字符后跟两个大写十六进制字符组成的三个字符序列,例如字节0映射到“%00”,字节0xAB映射到“%AB”。

这是编码,我也必须使解码功能。

这可能是一些现有的编码吗?我用谷歌搜索,但找不到任何东西。 我知道U +适用于Unicode。

我可以将其映射为:

if(bytesArray[i] == 0x21)
{
    bytesArray[i] = U+0021;
}

1 个答案:

答案 0 :(得分:0)

由于您要翻译字符串中的值,因此可以使用String.replace实际需要替换的唯一内容是%XX符号;其他角色可以保持不变。

在这种情况下,您可以使用replace命令的用户定义函数

decodedArray = byteArray.replace (/%([0-9A-F][0-9A-F])/g,
    function (match, p1)
    {
        return String.fromCharCode(parseInt(p1, 16));
    } );

这是一个安全的操作,因为根据规范,文字%字符可能不会出现在编码字符串中(如果您想知道:那是单独的代码0x25在其他可打印的纯ASCII范围内)。即使字符串中出现迷路%,只有在实际后跟两个有效的大写十六进制字节时才会被替换。

编码同样简单明了:

encodedArray = originalString.replace (/[^ -$&-~]/g,
    function (match)
    {
        if (match.charCodeAt(0) < 16)
           return '%0'+match.charCodeAt(0).toString(16).toUpperCase();
        return '%'+match.charCodeAt(0).toString(16).toUpperCase();
    } );

请注意&#39;匹配&#39;正则表达式是您要翻译的代码列表的精确ASCII表示;它被否定,因为你想要找到所有的字符 范围之外。

这比映射更有效,因为这需要您手动循环遍历每个字符并检查它以确定它是否需要转换。这对于编码(你需要一个所有代码的列表,包含它编码的一个或三个字节的字符串),但对于解码来说相当不错em>你需要提前看2个字节,测试它们是否有效(!),如果是的话,跳过它们。与此相比,replace解决方案应该更快。