2014-10-07 84 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