我有一个完全可用的PHP项目。我正试图在Node.js中实现与该项目等效的功能。该项目依赖于从AWS中提取数据,然后从该数据中拆包一个标头。在PHP中,这是通过以下操作完成的:
$request = @self::$s3->getObject(self::$bucket, self::$filepath,false,0, self::HeaderSize+ 5 * self::ResolutionEntrySize + self::TileCountSize + 256 * self::TileEntrySize);
// Open the PAR file.
if( is_object($request) && ($request->code < 400)) {
self::$modifiedTime = $request->headers['time'];
// Read and unpack the header.
self::$header = unpack('I*', substr($request->body, 0, self::HeaderSize));
self::$resolutionEntry = substr($request->body, self::HeaderSize, self::ResolutionEntrySize);
self::$resolutionTable = substr($request->body, self::HeaderSize + 5 * self::ResolutionEntrySize, self::TileCountSize + 256 * self::TileEntrySize);
}
我不确定如何在Node.js中执行相同的操作。我尝试了以下操作:
aws.getObject(params, function(err, data){
if(err == null){
var objectData = data.Body.toString('utf-8');
var sub = objectData.substring(0, 28);
var header = bufferpack.unpack('I*', sub);
}
});
在PHP中,header
返回为一个数字数组,但在Node中,它表示它是null
。我知道AWS调用正在工作,因为data
返回如下:
{
AcceptRanges: 'bytes',
LastModified: 'Wed, 06 Apr 2016 20:04:02 GMT',
ContentLength: '1602862',
ETag: '9826l1e5725fbd52l88ge3f5v0c123a4"',
ContentType: 'application/octet-stream',
Metadata: {},
Body: <Buffer 01 00 00 00 ... > }
我是否错误地使用了Bufferpack?
是的,Bufferpack使用不正确。Bufferpack接受一个缓冲区,而不是字符串,所以不应该传入sub
,而应该传入data.Body
。此外,*
表示法无法识别,因此请使用所需的字节数,例如
var header = bufferpack.unpack('7I', data.Body);