2016-06-06 6 views
1

이 패키지를 공유 디렉토리 (npm)에 연결하는 데 사용하고 있습니다. 원래 smb2에서 포크.NODEJS 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 (파이썬 구현)이 타임 스탬프로 리틀 엔디안에있는 것을 발견 unsingned 오래 오래 (나는 종종 비단뱀을 사용하지 않는하지만 의미 < Q 생각). 그러나 nodejs에는 그러한 유형이 없습니다. 그래서 나는 시도 @gnerkus 솔루션 :

나는이 github.com/marsaud/node-smb2/blob/master/lib/messages/query_directory.js#L61

* 편집을 같이 하나 개의 파일 정보를 구문 분석 그러나 그것은 효과가 없을 것입니다. 반환 값

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

일부 버퍼의 경우 잘못된 날짜가 반환됩니다.

시 저는 Buffer.byteLength (obj.CreationTime) 길이로 버퍼를 체크하며 8를 반환한다. 그것은 버퍼가

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

답변

1

그래서를, 이후 기간에 대한 검색 microsoft msd 및 npm. 나는 그 버퍼가 64 바이트 길이 (8 바이트)라는 것을 알았다. 그것은 2 dwords로 구성되어 있습니다. 버퍼링되지 않은 정수의 의미는 FILETIME 시간 소인입니다.

그래서 만약 내가이 작업을 수행하는 데 필요한 그 버퍼에서 creationTime과 구문 분석 원 :

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

내가이 사람을 도움이되기를 바랍니다. 나는 자바 스크립트 날짜 개체 내 대답을 편집

0

당신은 buffer.readDoubleBE()로 버퍼를 읽을 수 있습니다 다음 반환 그래서 readUInt8()을 기능 를 사용하여 시도 (8)의 길이를 가지고 분명하다 :

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

에 FILETIME을 변환하는 NPM plugun win32filetime을 사용했다. 그것을 확인하십시오 :) –

관련 문제