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

时间:2016-06-06 20:26:27

标签: javascript python node.js buffer smb

我使用此程序包连接到共享目录(npm)。来自原始smb2的叉子。

我试图更改目录readdir函数(现在只返回文件名)。 所以我看了桑巴回来了我能得到的所有东西"解析"是这样的:

{ 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' } ]

我可以通过FileAttributes识别文件和目录。但我需要获得CreationTime,LastAccessTime,LastWriteTime。

从缓冲区的结构我可以认识到,我需要做的只是将缓冲区转换为日期/时间。

所以我几乎尝试了一切。转换为 utf ucs2 readUInt32LE(0) readUInt32BE(0)。我发现this(python实现)这个时间戳是小端的,因为未加工的长long (我不经常使用python,但我认为 &lt; Q 这意味着)。但是在nodejs中没有这样的类型。

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

*编辑: 所以我尝试了@gnerkus解决方案,但它无法正常工作。返回此

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

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

我将长度缓冲区检查为 Buffer.byteLength(obj.CreationTime),然后返回 8 。很明显,缓冲区的长度为8.所以我尝试使用函数 readUInt8()返回以下内容

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

2 个答案:

答案 0 :(得分:1)

所以,经过长期搜索微软msd和npm。我发现缓冲区长度为64位(8字节)。它由2个双字组成。无缓冲整数的含义是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 日期对象

答案 1 :(得分:0)

您可以使用buffer.readDoubleBE()

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