使用JavaScript的文本的位长度

使用JavaScript的文本的位长度,javascript,bits,valueconverter,Javascript,Bits,Valueconverter,如何在JavaScript中计算字符串的位? 例如,字符串0000xfe-kemZlF4IlEgljDF_4df:1102pwrq7的长度是多少位?能否将字符串复制到缓冲区,然后检查缓冲区的长度 var-str='…' var buf=新缓冲区(str) 控制台日志(基本长度) 如您所说,如果您只需要确保给定值至少为128位,那么您可能正在将该字符串传递给将该字符串转换为某个字节表示的对象。字符串如何转换为字节取决于它的编码方式 您提供给我们的示例字符串包含ASCII范围字符。如果字符串编码为A

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

能否将字符串复制到缓冲区,然后检查缓冲区的长度

var-str='…'

var buf=新缓冲区(str)


控制台日志(基本长度)

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

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

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

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

length * 2 * 8
位长,或592位

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

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

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

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

例子
if(!(“窗口中的TextEncoder”)警报(“对不起,此浏览器中没有TextEncoder…”);
否则{
btn.onclick=函数(){
var s=txt.value;
如果(s.长度!==16){
警报(“需要16个字符。”+(16-s.length)+“开始…”);
返回
}
var编码器=新的文本编码器(“ASCII”);//或使用UTF-8
var字节=编码器。编码;
console.log(字节);
如果(bytes.bytellength==16)警报(“确定,得到128位”);
else警报(“哦,得到了”+(bytes.byteLength*8)+“bits”);
};
}
输入16个ASCII字符:

Convert
我怀疑JavaScript规范是否规定了JavaScript引擎字符串的内部表示形式。您是否在询问JavaScript字符串占用多少内存?对于哪个JS环境?@Jacob,javascript字符串的内部表示被指定为无符号16位整数,它实际上是扩展实现Chrome的,它特别指出“序列中的每个整数值通常表示UTF-16文本的单个16位单元。但是,ECMAScript对这些值没有任何限制或要求,除非它们必须是16位无符号整数。“您通常可以将字符串编码为UTF-16,但这不是规范中的要求。本标准的一致性实施应解释符合Unicode标准3.0版或更高版本以及ISO/IEC 10646-1的字符,采用UCS-2或UTF-16作为编码形式,实施级别3。如果未另行规定采用的ISO/IEC 10646-1子集,则假定其为BMP子集集合300。如果采用的编码形式没有另外指定,则假定为UTF-16编码形式。@elad.chen谢谢,我也添加了答案的链接。