将字节数组写入二进制文件Javascript [英] Writing Byte Array To Binary File Javascript
问题描述
我正在尝试编写一个生成随机数的脚本,然后将这些数字转换为4Bytes组,然后将这些4字节组放入Uint8Array中,最后我尝试将数组保存到二进制文件中。这是我的代码:
I am trying to write a script that generates random numbers these number then are converted to groups of 4Bytes each then these 4-bytes-groups are put into an Uint8Array finally I try to save the array to binary file. Here is my code:
<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>
问题是生成的文件包含数字普通数字
例如Uint8Array中的元素可能是65,在我对二进制的理解中,这个值应该保存为大写字母 A 但是它存储为 65 而不是
The problem is that the generated file contains numbers plain numbers
for example an element in the Uint8Array may be 65, in my understanding to binary this value should be saved as capital letter A but it is stored as 65 instead
注意
Note
filesaver.min.js是我用来保存JS文件的库( GitHub上的链接)
filesaver.min.js is a library that I use to save files from JS (Link on GitHub)
推荐答案
Blob
构造函数确实希望连接类型化数组的数组,但是你只传递一个 Uint8Array
进入它。这可能会被解释为(我应该说,转换为?)一个DOM字符串数组 - 这就是你的数字来自的地方。
The Blob
constructor does expect an array of typed arrays to be concatenated, but you are passing only a single Uint8Array
into it. This will probably be interpreted as (should I say, "casted to"?) an array of DOM-strings - that's where your numbers are coming from.
一个quickfix会是使用
A quickfix would be to use
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"});
或不使用那些4字节字节
数组:
or not use those 4-byte bytes
arrays at all:
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"});
这篇关于将字节数组写入二进制文件Javascript的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!