2016-08-21 96 views
0

我想在我的一個web應用程序中使用flatbuffer。我已經使用下面的PHP代碼將這些緩衝區數據存儲在一個文件(buffer_content.txt)中。如何在瀏覽器中使用flatbuffer生成的數據?

// ...Code to store to disk or send over a network goes here... 
$file = 'buffer_content.txt'; 
$output = serialize($builder->dataBuffer()); 

$fp = fopen($file, "w"); 
fwrite($fp, $output); 
fclose($fp); 

通過ajax我可以從服務器獲取緩衝區數據。現在我需要從JavaScript中提取緩衝區中的原始數據。但是,我無法弄清楚如何做到這一點。

任何想法,如何做到這一點?

+1

好的,完成了,現在好了。 – mi6crazyheart

回答

0

你不想使用serialize。的DataBuffer已經包含序列化的數據,查了一下這裏說: https://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html

$ BUF = $ builder->的DataBuffer(); //類型Google\FlatBuffers\ByteBuffer

//此ByteBuffer中的數據不是從0開始,而是在buf-> getPosition()。

//中的數據的結束由buf-標記>容量(),所以尺寸爲

// buf->容量() - buf->爲getPosition()。

請確保以二進制模式寫入文件(通過"wb"fopen)。因爲它不是文本格式,所以不要將它稱爲.txt :)

然後在JS中,您在文件中讀取(再次以二進制模式,而不是文本),請確保它以Uint8Array ,然後按照這裏的代碼:https://google.github.io/flatbuffers/flatbuffers_guide_use_javascript.html

+0

感謝您的回覆。我已經設法解決這個問題。但是,我得到的一個奇怪的行爲是,這段代碼(來自原始示例 - https://google.github.io/flatbuffers/flatbuffers_guide_use_javascript.html)。 '''var hp = monster.hp(); var pos = monster.pos();'''我得到如下輸出:'hp:100 pos:null'''。而我應該得到HP = 300。 – mi6crazyheart

+0

爲什麼它從模式中給出默認值而不是在例子''\ MyGame \ Sample \ Monster :: AddHp($ builder,300);'''Ref:https ://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html – mi6crazyheart

+0

這聽起來像緩衝區沒有正確傳輸/編碼/解碼,但很難說沒有看到你的完整代碼。 – Aardappel

2

後引用Aardappel回答我做了以下更改我的代碼來解決此問題。

創建緩衝區文件

$file = 'buffer_content.bin'; 
$output = $builder->dataBuffer(); 

$fp = fopen($file, "wb"); 
fwrite($fp, $output); 
fclose($fp); 

代碼從文件中獲取緩衝區的內容&響應返回給Ajax調用

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', '1'); 
// change these to whatever is appropriate in your code 
$my_place = "/path/to/the/file/"; // directory of your file 
$my_file = "item.bin"; // your file 

//$my_path = $my_place.$my_file; 
$my_path = $my_file; 

header("Pragma: public"); 
header("Expires: 0"); 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: pre-check=0, post-check=0, max-age=0', false); 
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT'); 
$browser = $_SERVER['HTTP_USER_AGENT']; 

if(preg_match('/MSIE 5.5/', $browser) || preg_match('/MSIE 6.0/', $browser)) 
{ 
    header('Pragma: private'); 
    // the c in control is lowercase, didnt work for me with uppercase 
    header('Cache-control: private, must-revalidate'); 
    // MUST be a number for IE 
    header("Content-Length: ".filesize($my_path)); 
    header('Content-Type: application/x-download'); 
    header('Content-Disposition: attachment; filename="'.$my_file.'"'); 
} 
else 
{ 
    header("Content-Length: ".(string)(filesize($my_path))); 
    header('Content-Type: application/x-download'); 
    header('Content-Disposition: attachment; filename="'.$my_file.'"'); 
} 

header('Content-Transfer-Encoding: binary'); 

if ($file = fopen($my_path, 'rb')) 
{ 
    while(!feof($file) and (connection_status()==0)) 
    { 
     print(fread($file, filesize($my_path))); 
     flush(); 
    } 
    fclose($file); 
} 
?> 

代碼在客戶端解析的二進制數據

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'getBufferData.php', true); 

xhr.responseType = 'arraybuffer'; 

xhr.onload = function(e) { 
    // response is unsigned 8 bit integer 
    var responseArray = new Uint8Array(this.response); 

    var buf = new flatbuffers.ByteBuffer(responseArray); 
    var monster = MyGame.Sample.Monster.getRootAsMonster(buf); 

    var hp = monster.hp(); 
    var pos = monster.pos(); 

    console.log("hp : "+hp); 
    console.log("pos : "+pos); 
}; 

xhr.send(); 
相關問題