将字节数组写入二进制文件Javascript [英] Writing Byte Array To Binary File Javascript

查看:122
本文介绍了将字节数组写入二进制文件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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆