Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
纯JavaScript二进制操作_Javascript_File_Binaryfiles - Fatal编程技术网

纯JavaScript二进制操作

纯JavaScript二进制操作,javascript,file,binaryfiles,Javascript,File,Binaryfiles,作为个人项目,我正在用JavaScript(基于HTML5)编写6502模拟器。我正在移植我在C中创建的一个前身中的一些代码。要加载文件(在我的例子中是ROM),我可以使用以下C代码: unsigned char* buffer = calloc(1, 4096); FILE* file = fopen("xyz", "rb"); fread(buffer, 1, 4096, file); fclose(file); 然后像这样访问它: char firstChar = buffer[0];

作为个人项目,我正在用JavaScript(基于HTML5)编写6502模拟器。我正在移植我在C中创建的一个前身中的一些代码。要加载文件(在我的例子中是ROM),我可以使用以下C代码:

unsigned char* buffer = calloc(1, 4096);
FILE* file = fopen("xyz", "rb");
fread(buffer, 1, 4096, file);
fclose(file);
然后像这样访问它:

char firstChar = buffer[0];
short nextShort = (buffer[2] << 8) | buffer[1];
free(buffer);
从这里开始,我将reader.result作为文件的一个巨大的base64编码。我需要一种访问二进制文件的方法,就像我在开始的C示例中所做的那样,在这里我可以简单地获取值(或使用简单的按位操作)


我猜最可行的解决方案是一个值为0-255的数组,但我只需要访问,不管如何。

@bfavaretto为我指出了正确的方向

var file = document.getElementById("picker").files[0];
var reader = new FileReader();
reader.readAsArrayBuffer(file);
var buffer = new Uint8Array(reader.result);

然后可以作为缓冲区[0]访问第一个字节。

我是
simplebuf
库的作者。它允许快速的二进制解析/序列化,并且完全用javascript编写

例如:

var layout = [
    sb.field("len", sb.type.uint(32)),
    sb.field("padding", sb.type.uint(32)),
    sb.field("id", sb.type.string_dynamic("len"))
];
var original = {len: 4, "padding": 999, "id": "1234"};
sb.write(buffer, 0, original, layout);

位操纵确实不是我的拿手好戏,但我相信你应该将文件读入一个with。我会检查它,谢谢:)是的,这就成功了,结束了这个。让我给你一些建议:添加你的上一次更新作为答案,并接受你自己的答案。对于未来的访问者来说,这可能是有价值的内容!谢谢在这个过程中,你甚至得到了15个代表积分
var layout = [
    sb.field("len", sb.type.uint(32)),
    sb.field("padding", sb.type.uint(32)),
    sb.field("id", sb.type.string_dynamic("len"))
];
var original = {len: 4, "padding": 999, "id": "1234"};
sb.write(buffer, 0, original, layout);