1

如何在 JavaScript 中计算字符串的位数?例如字符串有多少位长0000xfe-kemZlF4IlEgljDF_4df:1102pwrq7

4

3 回答 3

3

提供的字符串 ("0000xfe-kemZlF4IlEgljDF_4df:1102pwrq7") 将是:

length * 2 * 8

位长,或592 位

这是因为字符串中的每个字符都被视为 16 位无符号值,至少在最常见的主流实现中是这样。这个细节可能可以讨论,但你在评论中提到这是出于安全目的 -

因此,假设您提供 ASCII 字符 (0-127) 或 UTF-8 (0-255),您可以使用该TextEncoder对象来确保提供足够的字符来生成 128 位。请注意 UTF-8 中的 Latin-1 字符,因为编码器可能会将它们投影到等效的 UTF-16 上,这意味着它将为其生成 2 个字节,而不仅仅是一个。

如果您使用纯 JavaScript 字符串来保存 ASCII 字符,您将有一半的位置表示为 0,这会显着降低安全性,因此需要从 UTF-16/UCS-2 编码为 ASCII 或 UTF-8。

要使用TextEncoder,您只需提供一个表示 16 个字符的字符串,此时为 256 位 (16x16),但每个字符都在 ASCII/UTF-8 值范围内。编码后,除非使用了某些特殊字符,否则二进制缓冲区作为类型化数组应表示 128 位 (16x8)。

例子

if (!("TextEncoder" in window)) alert("Sorry, no TextEncoder in this browser...");
else {
  btn.onclick = function() {
  
    var s = txt.value;
    if (s.length !== 16) {
      alert("Need 16 chars. " + (16 - s.length) + " to go...");
      return
    }
  
    var encoder = new TextEncoder("ASCII");  // or use UTF-8
    var bytes = encoder.encode(s);
  
    console.log(bytes);

    if (bytes.byteLength === 16) alert("OK, got 128 bits");
    else alert("Oops, got " + (bytes.byteLength * 8) + " bits.");
  };
}
<label>Enter 16 ASCII chars: <input id=txt maxlength=16></label>
<button id=btn>Convert</button>

如果使用较旧的浏览器,另一种方法TextEncoder是手动迭代字符串并提取和屏蔽每个字符以从中构建二进制数组。

于 2016-06-17T07:57:01.847 回答
0

您可以将字符串复制到缓冲区中,然后检查缓冲区的长度吗?

var str = '...';

var buf = 新缓冲区(str);

控制台.log(buf.length);

于 2012-10-24T21:01:35.030 回答
0

如果,如您所说,您只需要确保给定值至少为 128 位,那么您可能会将这个字符串传递给将字符串转换为某种字节表示的东西。字符串如何转换为字节取决于它的编码方式。

您给我们的示例字符串包含 ASCII 范围的字符。如果字符串被编码为 ASCII,那么它是每个字符 8 位。如果字符串被编码为 UTF-8,那么每个字符 8 位,但如果字符串可能包含比您提供的样本更大的字符值,那么每个字符可能超过 8 位,具体取决于字符。如果将其编码为 UTF-16,则每个字符至少为 16 位,但可能更多取决于字符。如果它被编码为 USC-2,那么它总是每个字符 16 位。

我们不知道这个要求是从哪里来的,以及需要这个字符串的系统是如何使用它的。如果系统使用每个字符的固定位数,那么这就像获取length字符串的 并乘以适当的数字一样简单。如果不是那么简单,那么您需要使用正确的编码对字符串进行编码,很可能是字节数组,然后乘以 8 * 字节数以获得位数。

于 2012-10-24T22:20:36.763 回答