With WebGL coming in, it is important to be able to deal with binary data files like the models. Since there is no such thing on the internet right now I decided to make my own. The javascript BinaryReader library tries to mimic the C# BinaryReader.
The code is mostly based on the binary-parser class from Jonas Raoni Soares Silva. I’ve added the position management and re-factored the code to remove the with syntax.
In order to load a file into a string, you have to add req.overrideMimeType('text/plain; charset=x-user-defined'); in the Ajax XMLHttpRequest. To read more about this technique, see the Mozilla Developer Center. Here is an overview of the compatible browsers.
- Chrome 4.0.295.0: Works
- Firefox 3.5.7: Works
- Safari 4.0.4: Works
- Internet Explorer 8: Does not work. Doesn’t have the overrideMimeType method.
- Opera 10.10: Does not work. Have the overrideMimeType method but doesn’t take it in account.
I hope this will help you to parse binary files!
Download
API
Constructor
- new BinaryReader(data: String) – Create a BinaryReader with the specified file.
Read Methods
- BinaryReader.readChar()
- BinaryReader.readString(length: Number)
- BinaryReader.readInt8()
- BinaryReader.readUInt8()
- BinaryReader.readInt16()
- BinaryReader.readUInt16()
- BinaryReader.readInt32()
- BinaryReader.readUInt32()
- BinaryReader.readUInt32()
- BinaryReader.readFloat()
- BinaryReader.readDouble()
Position Methods
- BinaryReader.seek(pos: Number) – Go to a specific position (in Byte) in the file
- BinaryReader.getPosition() – Returns the actual position (in Byte) in the file
- BinaryReader.getSize() – Returns the size (in Byte) of the file
Exception
- Error(“Index out of bound”) – When you try to read something that is beyond the end of the file.
Example – Demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// Code from https://developer.mozilla.org/En/Using_XMLHttpRequest#Receiving_binary_data function load_binary_resource(url) { var req = new XMLHttpRequest(); req.open('GET', url, false); // The following line says we want to receive data as Binary and not as Unicode req.overrideMimeType('text/plain; charset=x-user-defined'); req.send(null); if (req.status != 200) return ''; return req.responseText; } // Load the file var file = load_binary_resource('author.gif'); // Create the Binary Reader var reader = new BinaryReader(file); // Read some informations var tag = reader.readString(6); var width = reader.readUInt16(); var height = reader.readUInt16(); // Move around the file and try to read what is there reader.seek(parseInt('FA', 16)); var random = reader.readFloat(); console.log( tag, // GIF89a width, // 16 height, // 16 random // 66.01171875 ); |
// Load the file
var file = load_binary_resource(‘author.gif’);
// Create the Binary Reader
var reader = new BinaryReader(file);
// Read some informations
var tag = reader.readString(6);
var width = reader.readUInt16();
var height = reader.readUInt16();
// Move around the file and try to read what is there
reader.seek(parseInt(‘FA’, 16));
var random = reader.readFloat();
console.log(
tag, // GIF89a
width, // 16
height, // 16
random // 66.01171875
);