2014-10-07 89 views
1

我想寫一個腳本,生成隨機數這些數然後轉換爲4Bytes組每個然後這些4字節組放入Uint8Array最後我嘗試保存數組到二進制文件。這裏是我的代碼:寫字節數組到二進制文件Javascript

<html> 
<head> 
<title>Raandom Number Generator</title> 
</head> 
<body> 
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script> 
<script src="filesaver.min.js"></script> 
<script type="text/javascript"> 
    $(function() { 
     if (!Date.now) { 
      Date.now = function() { 
       return new Date().getTime(); 
      }; 
     } 

     alert("started"); 
     var currentMousePos = { 
      x : -1, 
      y : -1 
     }; 
     var randomData = []; 
     var bytes = new Int8Array(4); 

     $(document).mousemove(function(event) { 

      if(randomData.length>=1231){ 
       $(document).unbind('mousemove'); 
       console.log("Finished generating numbers ... trying to save file"); 
       randomData = new Uint8Array(randomData); 
       var blob = new Blob(randomData, {type: "application/octet-stream"}); 
       saveAs(blob, "rand.bin"); 
       return; 
      } 
      currentMousePos.x = event.pageX; 
      currentMousePos.y = event.pageY; 
      var longRandomNumber = Date.now() * (event.pageX + 1) 
        * (event.pageY + 1); 
      for (var i = 3; i >= 0; i--) { 
       bytes[i] = longRandomNumber & (255); 
       longRandomNumber = longRandomNumber >> 8 
      } 
      for (var i = 0; i < 4; i++) { 
       randomData.push(bytes[i]); 
      } 
      console.log(randomData.length); 
     }); 
    }) 
</script> 
</body> 
</html> 

的問題是,所生成的文件包含數字plain numbers例如在Uint8Array的元素可以是65,在我的理解爲二進制此值應保存爲大寫字母一個但它被存儲爲代替

filesaver.min.js是一個庫,我使用從JS保存文件(Link on GitHub

回答

2

Blob constructor不期望類型數組的數組要連接,但你只有經過一個Uint8Array進去。這可能會被解釋爲(我應該說,「鑄造」?)一個DOM字符串數組 - 這就是您的數字來自哪裏。

了一個quickfix是使用

new Blob([randomData], {type: "application/octet-stream"}) 
//  ^  ^

,但我會建議要麼做

var randomData = []; 
// while randomData.length < 308 
    var bytes = new Uint8Array(4); 
    for (var i=4; i--;) { 
     bytes[i] = longRandomNumber & (255); 
     longRandomNumber = longRandomNumber >> 8 
    } 
    randomData.push(bytes); 

var blob = new Blob(randomData, {type: "application/octet-stream"}); 

或不bytes陣列都使用那些4字節:

var randomData = new Uint8Array(1232), 
    count = 0; 
// while count < randomData.length 
    for (var i=4; i--;) { 
     randomData[count++] = longRandomNumber & (255); 
     longRandomNumber = longRandomNumber >> 8 
    } 

var blob = new Blob([randomData], {type: "application/octet-stream"}); 
+0

謝謝很多第一個建議爲我工作:) – 2014-10-08 10:23:33