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。
所以我几乎尝试了所有方法。转换为 utf、ucs2、readUInt32LE(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
我正在使用这个包连接到共享目录(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。
所以我几乎尝试了所有方法。转换为 utf、ucs2、readUInt32LE(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