NODEJS SMB2 - 将缓冲区转换为日期和时间

NODEJS SMB2 - convert buffer to date and time

我正在使用这个包连接到共享目录(npm)。从原始 smb2 分叉。

我正在尝试更改目录 readdir 函数(现在仅 returns 文件名)。 所以我看了看什么samba returns我能得到的"parsed"是这样的:

{ Index: 0,
    CreationTime: <Buffer 05 6f bd 13 76 ba d1 01>,
    LastAccessTime: <Buffer 05 6f bd 13 76 ba d1 01>,
    LastWriteTime: <Buffer b8 e4 a8 09 c0 9f d1 01>,
    ChangeTime: <Buffer 3e bd 43 17 c1 bc d1 01>,
    EndofFile: <Buffer 57 12 00 00 00 00 00 00>,
    AllocationSize: <Buffer 00 20 00 00 00 00 00 00>,
    FileAttributes: 32,
    FilenameLength: 16,
    EASize: 0,
    ShortNameLength: 0,
    FileId: <Buffer 00 00 00 00 00 00 00 00>,
    Filename: 'test.xxx' } ]

我可以通过文件属性识别文件和目录。但我需要获取 CreationTime、LastAccessTime、LastWriteTime。

从缓冲区的结构我可以看出我唯一需要做的就是将缓冲区转换为 date/time。

所以我几乎尝试了所有方法。转换为 utfucs2readUInt32LE(0)readUInt32BE(0) 。我发现 this(python 实现) 这个时间戳是小端的 unsingned long long (我不经常使用 python 但我认为 的意思)。但是在nodejs中没有这样的类型。

我这样解析一个文件信息github.com/marsaud/node-smb2/blob/master/lib/messages/query_directory.js#L61

*编辑: 所以我尝试了@gnerkus 解决方案,但它不起作用。 Returns这个

-4.377115596215621e-89 //readDoubleBE()
Thu Jan 01 1970 01:00:00 GMT+0100 (Central Europe Standard Time) //Date()

对于某些缓冲区,它 returns 无效日期。

Si 我检查长度缓冲区为 Buffer.byteLength(obj.CreationTime) 并且它 returns 8.很明显缓冲区的长度为 8。所以我尝试使用 readUInt8() 函数 returns following

6.618094934489594e-300 //readUInt8()
Thu Jan 01 1970 01:00:00 GMT+0100 (Central Europe Standard Time)  //Date()

您可以使用 buffer.readDoubleBE() 读取缓冲区:

// This assumes the name of the object returned by smb2 is 'obj'
var createdAt = new Date(obj.CreationTime.readDoubleBE());

所以,在微软 msd 和 npm 上搜索了很久。我发现缓冲区是 64 位长度(8 字节)。它由 2 个双字组成。 unbuffered integer 的含义是 FILETIME 时间戳。

因此,如果我想从该缓冲区解析 creationTime,我需要这样做:

buffer = v.LastWriteTime;
var low = buffer.readUInt32LE(0);
var high = buffer.readUInt32LE(4);
v.LastWriteTime = FileTime.toDate({low: low, high: high}).toISOString()

希望对大家有所帮助。我使用 npm plugun win32filetime 将 FILETIME 转换为 javascript Date Object