NodeJS Buffer.byteLength返回的字节长度差异很大

ghhaqwfi  于 2023-03-08  发布在  Node.js
关注(0)|答案(4)|浏览(171)

使用Node.js v5.1.0,我尝试确定缓冲区的内容长度。

Buffer.byteLength(self.data, 'utf8')

其中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 ... >

在文件系统(OS X)上,我加载的图像是109,055字节(磁盘上为111 KB),但我的内容长度计算返回198,147字节。如果我将编码设置为ascii,它返回104,793字节。
我的计算是否正确?我是否需要对缓冲区做些什么来使它返回正确的值?如果我做得对,为什么会有差异?如果我做得不对,那么,请分享;)

vc9ivgsu

vc9ivgsu1#

我认为有以下几点不同:

  • buffer.length:缓冲区的已用长度+保留长度。
  • buffer.byteLength:缓冲区的已用长度。
  • 缓冲区.toString().长度:缓冲区字节的默认字符串呈现/解释中的字符数。您可以通过提供不同的编码来更改该呈现/解释。(例如toString("ascii")
  • 缓冲区.byteLength(缓冲区,目标编码):理解“buffer”中的字节使用UTF-8编码(即字节将被呈现/解释为UTF-8字符串),这将返回以某种指定编码(targetEncoding)存储UTF-8字符串所需的字节数。

关于最后一项(Buffer.byteLength()),我不完全确定我的解释是否正确,但这是我从下面的简要描述中所能得出的最好结果:https://nodejs.org/api/buffer.html#buffer_class_method_buffer_bytelength_string_encoding

EDIT:根据此评论,上面的描述对于buffer.lengthbuffer.byteLength中的一个似乎是不正确的(因为他们有一个缓冲区,其byteLength高于其length)。如果有人找到不匹配的解释,请评论或编辑此帖子!

qkf9rpyu

qkf9rpyu2#

如文档中所述,Buffer.byteLength()返回采用特定编码的字符串的字节长度。
Buffer类型实际上是一个ArrayBuffer,这意味着它的长度可以通过byteLength属性获得。另外,Node的实现添加了一个length属性,提供相同的长度。

nmpmafwu

nmpmafwu3#

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

此时,我们知道作为缓冲对象的属性.byteLength.length是严格相等的。

buf.write('ab'); // 2 - returns length of string 'ab' written to buf
buf.length // 4
buf.byteLength // 4

.length.和.byteLength都返回4。保留长度和已用长度之间没有区别,正如链接答案所声明的那样。
关于Buffer.byteLength(string, encoding='utf-8') * 函数 *(不同于.byteLength * 属性 *),可接受答案是正确的,该函数给出了使用指定编码参数(默认为utf-8)编码的字符串的字节长度。

jm81lzqq

jm81lzqq4#

// Function to convert a base64 'data:...ssdd//' data Uri to arrayBuffer
function base64tobuffer(base64) {
  return new Promise((resolve) => {
    fetch(base64).then((response) => {return(response.arrayBuffer())})
      .then((b)=>{
        if(b.byteLength % 2 == 0) {
            //console.log("The number is even.");
        }else{console.log(`The number ${b.byteLength} is odd`);b = b.slice(0,b.byteLength-1)}
        resolve(b);
    });
  })
}

我需要一个byteLength为偶数的缓冲区

b = b.slice(0,b.byteLength-1)

或在使用时导致错误

new Uint16Array(buffer);

在我的项目后面。上面的代码片最后byteLength并且不干扰缓冲区的头

相关问题