Buffer.byteLength返回截然不同的字节长度

时间:2016-02-05 21:20:16

标签: javascript node.js buffer

使用Node.js v5.1.0,我试图确定缓冲区的内容长度。因此,我这样做:

public class AsyncManualResetEvent
{
    private volatile CompletionWrapper _completionWrapper = new CompletionWrapper();

    public Task WaitAsync()
    {
        var wrapper = _completionWrapper;
        wrapper.WaitAsyncCalled = true;
        return wrapper.Tcs.Task;
    }

    public bool WaitAsyncCalled
    {
        get { return _completionWrapper.WaitAsyncCalled; }
    }

    public void Set() {
        _completionWrapper.Tcs.TrySetResult(true); }

    public void Reset()
    {
        while (true)
        {
            var wrapper = _completionWrapper;
            if (!wrapper.Tcs.Task.IsCompleted ||
                Interlocked.CompareExchange(ref _completionWrapper, new CompletionWrapper(), wrapper) == wrapper)
                return;
        }
    }
    private class CompletionWrapper
    {
        public TaskCompletionSource<bool> Tcs { get; } = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
        public bool WaitAsyncCalled { get; set; }
    }
}

Buffer.byteLength(self.data, 'utf8') 看起来像这样:

self.data

我正在加载的图像是文件系统(OS X)上的109,055字节(磁盘上为111 KB),但我的内容长度计算返回198,147字节。如果我将编码设置为<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 ... > ,则返回104,793字节。更接近,但仍然不正确。

我是否正确计算了这个?我是否需要对缓冲区执行某些操作才能使其返回正确的值?如果我做对了,为什么会出现这种差异呢?如果我做错了,那么请分享;)

2 个答案:

答案 0 :(得分:2)

正如文档中所解释的,Buffer.byteLength()返回假设特定编码的字符串的字节长度。

Buffer类型实际上是ArrayBuffer,这意味着它的长度可以通过byteLength属性获取。此外,Node的实现添加了length属性,该属性提供相同的长度。

答案 1 :(得分:0)

我认为区别如下:

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

关于最后一项(Buffer.byteLength()),我不确定我的解释是否正确,但这是我可以从此处的简要说明中得出的最好结论:https://nodejs.org/api/buffer.html#buffer_class_method_buffer_bytelength_string_encoding