将十六进制字符串数组转换为数字

时间:2015-06-11 18:46:51

标签: javascript hex typed-arrays

我有一个应用程序,其中服务器每秒向请求它的客户端发送大量数据。在这个数据集中有几个(大)数组包含数字(在某些情况下是16位整数,在其他情况下是双精度浮点数)。为了减小数据包大小,我想只发送表示数字所需的字节数(16位为2字节,64位为8字节)。我知道我可以这样做:

/* Create space for 4 32 bit numbers */
var buffer = new ArrayBuffer(16);

/* Hex representation of [0, 123, 246, 369] */
buffer = ["0x0", 0x7B", "0xF6", "0x171"];

/* Actual array containing numbers above */
var int32View = new Int32Array(buffer); 

但....我不想在" 0x" (添加两个字节将使16位数字的大小加倍)。我想我可能会遗漏一些东西 - 有没有更好的方法来做到这一点,我不需要表明字符串是数字的十六进制表示(即我可以删除" 0x") ?

谢谢,马特

1 个答案:

答案 0 :(得分:0)

您可以使用map()或for循环来处理每个值,并使用长度作为对其进行排序的基础。

但是请注意,你提到的是64位浮点数。当从缓冲区中提取它们时,它们将是以IEEE-754格式格式化的64位整数值(即0xXXXXXXXXXXXXXXXX)。

但是,JavaScript只能使用32位值(0xXXXXXXXX),所以你必须使用32位无符号数组将它们的处理分成两部分,然后再添加一个Float64Array视图。

如果浮点值是文字,即“2.345”,“ - 1.33”等,那么你可以简单地对它们使用parseFloat(str)(而不是如下处理64位值)。

实施例

// inserted 64-bit IEEE float of -2.3357 = 0x7b4a233ac002af83
var normArray = ["0", "7B", "F6", "7b4a233ac002af83", "171"],
    int16a = [], int32a = [],
    int16b, int32b, float64b;

normArray.map(function(entry) {
  if (entry.length > 4) {
    var high = entry.substr(0, 8),
        low = entry.substr(8, 8);
    int32a.push(parseInt(high, 16), parseInt(low, 16));
  }
  else {
    int16a.push(parseInt(entry, 16));
  }
});

// convert to typed arrays
int16b = new Int16Array(int16a);
int32b = new Uint32Array(int32a);
float64b = new Float64Array(int32b.buffer); // convert IEEE rep. to floats

document.writeln("<pre>int16  : " +
                int16b[0] + ", " + int16b[1] + ", " + int16b[2] + ", ...");
document.write("float64: " + float64b[0] + "</pre>")