如何计算JavaScript中字符串的位数?
例如,字符串0000xfe-kemZlF4IlEgljDF_4df:1102pwrq7
的长度是多少?
答案 0 :(得分:2)
提供的字符串(“0000xfe-kemZlF4IlEgljDF_4df:1102pwrq7”)将是:
length * 2 * 8
位长,或 592位。
这是因为字符串中的每个字符都被视为16位无符号值,至少在最常见的主流实现中是这样。详细信息可以probably be discussed,但您在评论中提到它是出于安全目的 -
因此,假设您提供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的编码。 / p>
要使用TextEncoder,您只需提供一个代表16个字符的字符串,此时为256位(16x16),但每个char都在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
的替代方法是手动迭代字符串并提取并屏蔽每个字符串以构建二进制数组。
答案 1 :(得分:0)
您可以将字符串复制到缓冲区中,然后检查缓冲区的长度吗?
var str ='...';
var buf = new Buffer(str);
的console.log(buf.length);
答案 2 :(得分:0)
如果正如您所说,您只需要确保给定值至少为128位,那么您可能会将此字符串传递给将字符串转换为某个字节表示形式的字符串。字符串如何转换为字节取决于它的编码方式。
您提供给我们的示例字符串包含ASCII范围字符。如果字符串编码为ASCII,则每个字符为8位。如果字符串被编码为UTF-8,那么每个字符将是8位,但如果字符串可能包含比您提供的样本更大的字符值,则每个字符可能超过8位,具体取决于字符。如果它被编码为UTF-16,则每个字符至少为16位,但可能更多取决于字符。如果它被编码为USC-2,则每个字符总是16位。
我们不知道此要求的来源以及需要此字符串的系统如何使用它。如果系统每个字符使用固定数量的位,那么这与获取字符串的length
并乘以适当的数字一样简单。如果它不是那么简单,那么你需要使用正确的编码编码字符串,最有可能是字节数组,然后乘以8 *字节数来获得位数。