bra*_*ipt 4 javascript buffer node.js
使用 Node.js v5.1.0,我试图确定缓冲区的内容长度。因此,我正在这样做:
Buffer.byteLength(self.data, 'utf8')
Run Code Online (Sandbox Code Playgroud)
其中,self.data如下所示:
<Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 f0 00 f0 00 00 ff db 00 43 00 05 03 04 04 04 03 05 04 04 04 05 05 05 06 07 0c 08 07 07 07 07 0f 0b 0b 09 ... >
Run Code Online (Sandbox Code Playgroud)
我正在加载的图像在文件系统 (OS X) 上为 109,055 字节(磁盘上为 111 KB),但我的内容长度计算返回了 198,147 字节。如果我将编码设置为ascii,它将返回 104,793 个字节。更接近,但仍然不正确。
我计算正确吗?我需要对缓冲区做些什么才能让它返回正确的值吗?如果我做对了,为什么会出现差异?如果我做错了,好吧,请分享;)
如文档中所述,Buffer.byteLength()返回假设特定编码的字符串的字节长度。
该Buffer类型实际上是一个ArrayBuffer,这意味着它的长度可以通过属性获取byteLength。此外,Node 的实现添加了一个length提供相同长度的属性。
OP 中的混乱在于该Buffer.byteLength()函数,该函数采用字符串和编码作为参数,并且与.byteLength缓冲区对象上的属性不同。
投票最高的答案也混淆了这两个概念(Buffer.byteLength 返回截然不同的字节长度),但我不能再改变我对它的投票。
这是一个解释:
let buf = Buffer.alloc(4); // <Buffer 00 00 00 00>
buf.length; // 4
buf.byteLength; // 4
buf.byteLength === buf.Length //true
Run Code Online (Sandbox Code Playgroud)
此时我们知道 和.byteLengthas.length缓冲区对象的属性是严格相等的。
buf.write('ab'); // 2 - returns length of string 'ab' written to buf
buf.length // 4
buf.byteLength // 4
Run Code Online (Sandbox Code Playgroud)
两个都.length。并.byteLength返回 4。正如链接的答案所声明的那样,保留长度和使用长度之间没有区别。
关于该函数,接受的答案是正确的Buffer.byteLength(string, encoding='utf-8') (与.byteLength property不同),它给出了使用指定编码参数(默认 utf-8)编码的字符串的字节长度。
我认为区别如下:
buffer.length: 缓冲区已用+保留长度。buffer.byteLength: 缓冲区的使用长度。buffer.toString().length:缓冲区字节的默认字符串呈现/解释中的字符数。您可以通过提供不同的编码来更改渲染/解释。(例如。toString("ascii"))Buffer.byteLength(buffer, targetEncoding):了解“缓冲区”中的字节使用 UTF-8 编码(即字节旨在呈现/解释为 UTF-8 字符串),这将返回存储该 UTF-8 字符串所需的字节数某些指定的编码 ( targetEncoding)。在最后一项 ( Buffer.byteLength()) 上,我不完全确定我的解释是正确的,但这是我从这里的简要描述中可以得出的最好结果:https : //nodejs.org/api/buffer.html#buffer_class_method_buffer_bytelength_string_encoding
| 归档时间: |
|
| 查看次数: |
4755 次 |
| 最近记录: |