diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index bc62882748..f897e263ef 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -117,6 +117,7 @@ All definitions files include a header with the author and editors, so at some p
* [jake](https://github.com/mde/jake) (by [Kon](http://phyzkit.net/))
* [Jasmine](http://pivotal.github.com/jasmine/) (by [Boris Yankov](https://github.com/borisyankov))
* [Jasmine-jQuery](https://github.com/velesin/jasmine-jquery) (by [Gregor Stamac](https://github.com/gstamac))
+* [jDataView](https://github.com/jDataView/jDataView) (by [Ingvar Stepanyan](https://github.com/RReverser))
* [JointJS](http://www.jointjs.com/) (by [Aidan Reel](http://github.com/areel))
* [jQRangeSlider](http://ghusse.github.com/jQRangeSlider) (by [Dániel Tar](https://github.com/qcz))
* [jQuery](http://jquery.com/) (from TypeScript samples)
diff --git a/jdataview/jdataview-tests.ts b/jdataview/jdataview-tests.ts
new file mode 100644
index 0000000000..273db3ea39
--- /dev/null
+++ b/jdataview/jdataview-tests.ts
@@ -0,0 +1,74 @@
+///
+///
+
+interface TARMetaData {
+ name: string;
+ mode: number;
+ owner: number;
+ group: number;
+ size: number;
+ modtime: number;
+ checksum: number;
+ link: string;
+ name_linked: string;
+ ustar: string;
+ ustar_version: number;
+ owner_name: string;
+ group_name: string;
+ device: number[];
+ name_prefix: string;
+}
+
+// Download the file
+$.get('jquery.tar', function (data) {
+ // Make a view on the data
+ var view = new jDataView(data);
+
+ // console.log(view.getUint32(0, true));
+ // console.log(view.getUint32(0, false));
+ // view.seek(0);
+
+ while (view.tell() < view.byteLength) {
+ // Parse the file meta data
+ var metadata: TARMetaData = {
+ name: view.getString(100).replace(/\0+$/, ''),
+ mode: parseInt(view.getString(8), 8),
+ owner: parseInt(view.getString(8), 8),
+ group: parseInt(view.getString(8), 8),
+ size: parseInt(view.getString(12), 8),
+ modtime: parseInt(view.getString(12), 8),
+ checksum: parseInt(view.getString(8), 8),
+ link: view.getChar(),
+ name_linked: view.getString(100).replace(/\0+$/, ''),
+ ustar: view.getString(6),
+ ustar_version: parseInt(view.getString(2), 8),
+ owner_name: view.getString(32).replace(/\0+$/, ''),
+ group_name: view.getString(32).replace(/\0+$/, ''),
+ device: [parseInt(view.getString(8), 8), parseInt(view.getString(8), 8)],
+ name_prefix: view.getString(155).replace(/\0+$/, '')
+ };
+
+ // Padding
+ if (view.tell() % 512 !== 0) {
+ view.seek(view.tell() + 512 - (view.tell() % 512));
+ }
+
+ // Get the file
+ if (isNaN(metadata.size)) {
+ break;
+ }
+ var content = view.getString(metadata.size);
+
+ // Padding
+ if (view.tell() % 512 != 0) {
+ view.seek(view.tell() + 512 - (view.tell() % 512));
+ }
+
+ // Print the file
+ $(document.body).append($('
').html(JSON.stringify(metadata, null, ' ')));
+
+ if (metadata.size) {
+ $('body').append($('').val(content));
+ }
+ }
+});
\ No newline at end of file
diff --git a/jdataview/jdataview.d.ts b/jdataview/jdataview.d.ts
new file mode 100644
index 0000000000..cff1160326
--- /dev/null
+++ b/jdataview/jdataview.d.ts
@@ -0,0 +1,105 @@
+// Type definitions for jDataView
+// Project: https://github.com/jDataView/jDataView
+// Definitions by: Ingvar Stepanyan
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+declare class jDataView implements DataView {
+ constructor(byteCount: number, offset?: number, length?: number, littleEndian?: boolean)
+ constructor(buffer: string, offset?: number, length?: number, littleEndian?: boolean)
+ constructor(buffer: jDataView.Bytes, offset?: number, length?: number, littleEndian?: boolean)
+ buffer: any
+ byteOffset: number
+ byteLength: number
+
+ // 64 bit integers
+ getInt64(byteOffset?: number, littleEndian?: boolean): jDataView.Int64
+ setInt64(byteOffset: number, value: jDataView.Int64, littleEndian?: boolean): void
+ writeInt64(value: jDataView.Int64, littleEndian?: boolean): void
+ getUint64(byteOffset?: number, littleEndian?: boolean): jDataView.Uint64
+ setUint64(byteOffset: number, value: jDataView.Uint64, littleEndian?: boolean): void
+ writeUint64(value: jDataView.Uint64, littleEndian?: boolean): void
+
+ // Bitfields
+ getSigned(bitLength: number, byteOffset?: number): number
+ setSigned(byteOffset: number, value: number, bitLength: number): void
+ writeSigned(value: number, bitLength: number): void
+ getUnsigned(bitLength: number, byteOffset?: number): number
+ setUnsigned(byteOffset: number, value: number, bitLength: number): void
+ writeUnsigned(value: number, bitLength: number): void
+
+ // Internal utilities
+ wrapBuffer(string: string): jDataView.Buffer
+ wrapBuffer(bytes: jDataView.Bytes): jDataView.Buffer
+ wrapBuffer(byteCount: number): jDataView.Buffer
+ createBuffer(...bytes: number[]): jDataView.Buffer
+
+ // Operation control
+ seek(byteOffset: number): number
+ tell(): number
+ skip(byteLength: number): number
+ slice(start: number, end?: number, forceCopy?: boolean): jDataView
+
+ // Specification getters
+ getInt8(byteOffset?: number): number
+ getUint8(byteOffset?: number): number
+ getInt16(byteOffset?: number, littleEndian?: boolean): number
+ getUint16(byteOffset?: number, littleEndian?: boolean): number
+ getInt32(byteOffset?: number, littleEndian?: boolean): number
+ getUint32(byteOffset?: number, littleEndian?: boolean): number
+ getFloat32(byteOffset?: number, littleEndian?: boolean): number
+ getFloat64(byteOffset?: number, littleEndian?: boolean): number
+
+ // Specification setters
+ setInt8(byteOffset: number, value: number): void
+ setUint8(byteOffset: number, value: number): void
+ setInt16(byteOffset: number, value: number, littleEndian?: boolean): void
+ setUint16(byteOffset: number, value: number, littleEndian?: boolean): void
+ setInt32(byteOffset: number, value: number, littleEndian?: boolean): void
+ setUint32(byteOffset: number, value: number, littleEndian?: boolean): void
+ setFloat32(byteOffset: number, value: number, littleEndian?: boolean): void
+ setFloat64(byteOffset: number, value: number, littleEndian?: boolean): void
+
+ // Strings and Blobs
+ getChar(byteOffset?: number): string
+ setChar(byteOffset: number, char: string): void
+ writeChar(char: string): void
+ getString(byteLength: number, byteOffset?: number, encoding?: string): string
+ setString(byteOffset: number, chars: string, encoding?: string): void
+ writeString(chars: string, encoding?: string): void
+ getBytes(length: number, byteOffset?: number, littleEndian?: boolean, toArray?: boolean): number[]
+ setBytes(byteOffset: number, bytes: number[], littleEndian?: boolean): void
+ writeBytes(bytes: number[], littleEndian?: boolean): void
+
+ // writeXXX methods
+ writeInt8(value: number): void
+ writeUint8(value: number): void
+ writeInt16(value: number, littleEndian?: boolean): void
+ writeUint16(value: number, littleEndian?: boolean): void
+ writeInt32(value: number, littleEndian?: boolean): void
+ writeUint32(value: number, littleEndian?: boolean): void
+ writeFloat32(value: number, littleEndian?: boolean): void
+ writeFloat64(value: number, littleEndian?: boolean): void
+}
+
+declare module jDataView {
+ interface Bytes {
+ length: number;
+ [index: number]: number;
+ }
+
+ interface Buffer extends Bytes {
+ byteLength: number;
+ }
+
+ class Uint64 {
+ lo: number
+ hi: number
+ constructor(lo: number, hi: number)
+ valueOf(): number
+ static fromNumber(number: number): Uint64
+ }
+
+ class Int64 extends Uint64 {
+ static fromNumber(number: number): Int64
+ }
+}
\ No newline at end of file