纯JavaScript二进制操作
作为个人项目,我正在用JavaScript(基于HTML5)编写6502模拟器。我正在移植我在C中创建的一个前身中的一些代码。要加载文件(在我的例子中是ROM),我可以使用以下C代码:纯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];
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);