Cromon

Untitled

Aug 20th, 2013
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var BinaryReader = function(buffer) {
  2.     this.position = 0;
  3.     this.length = buffer.length;
  4.     this.data = buffer;
  5. }
  6.  
  7. BinaryReader.prototype.readInt8 = function() {
  8.     var ret = this.data.charCodeAt(this.position);
  9.     ++this.position;
  10.     return ret & 0xFF;
  11. }
  12.  
  13. BinaryReader.prototype.readInt16 = function() {
  14.     var b1 = this.readInt8();
  15.     var b2 = this.readInt8();
  16.  
  17.     return b1 | (b2 << 8);
  18. }
  19.  
  20. BinaryReader.prototype.readInt32 = function() {
  21.     var s1 = this.readInt16();
  22.     var s2 = this.readInt16();
  23.  
  24.     return s1 | (s2 << 16);
  25. }
  26.  
  27. BinaryReader.prototype.readInt64 = function() {
  28.     var i1 = this.readInt32();
  29.     var i2 = this.readInt32();
  30.  
  31.     return i1 | (i2 << 32);
  32. }
  33.  
  34. BinaryReader.prototype.readFloat = function() {
  35.     var bits = this.readInt32();
  36.  
  37.     var sign     = ((bits & 0x80000000) == 0) ? 1 : -1;
  38.     var exponent = ((bits & 0x7f800000) >> 23);
  39.     var mantissa =  (bits & 0x007fffff);
  40.  
  41.     mantissa |= 0x00800000;
  42.     return (sign * mantissa * Math.pow(2, exponent - 150));
  43. }
  44.  
  45. BinaryReader.prototype.readString = function(length) {
  46.     if(typeof length !== "undefined") {
  47.         var ret = "";
  48.         var cur = this.readInt8();
  49.         while(cur !== 0) {
  50.             ret += String.fromCharCode(cur);
  51.             cur = this.readInt8();
  52.         }
  53.  
  54.         return ret;
  55.     } else {
  56.        var content = [];
  57.        for(var i = 0; i < length; ++i) {
  58.            content.push(this.readInt8());
  59.        }
  60.  
  61.        return String.fromCharCode.apply(String, content);
  62.     }
  63. }
  64.  
  65. BinaryReader.prototype.readArray = function(length, typeDesc) {
  66.     if(typeDesc === Float32Array) {
  67.         var ret = new Float32Array(length);
  68.         for(var i = 0; i < length; ++i) {
  69.             ret[i] = this.readFloat();
  70.         }
  71.  
  72.         return ret;
  73.     }
  74.  
  75.     if(typeDesc === Int32Array) {
  76.         var ret = new Int32Array(length);
  77.         for(var i = 0; i < length; ++i) {
  78.             ret[i] = this.readInt32();
  79.         }
  80.  
  81.         return ret;
  82.     }
  83.  
  84.     if(typeDesc === Int16Array) {
  85.         var ret = new Int16Array(length);
  86.         for(var i = 0; i < length; ++i) {
  87.             ret[i] = this.readInt16();
  88.         }
  89.  
  90.         return ret;
  91.     }
  92.  
  93.     if(typeDesc === Int8Array) {
  94.         var ret = new Int8Array(length);
  95.         for(var i = 0; i < length; ++i) {
  96.             ret[i] = this.readInt8();
  97.         }
  98.  
  99.         return ret;
  100.     }
  101.  
  102.     if(typeDesc === Uint8Array) {
  103.         var ret = new Uint8Array(length);
  104.         for(var i = 0; i < length; ++i) {
  105.             ret[i] = this.readInt8() & 0xFF;
  106.         }
  107.  
  108.         return ret;
  109.     }
  110.  
  111.     var ret = [];
  112.     for(var i = 0; i < length; ++i) {
  113.         ret.push(this.readType(typeDesc));
  114.     }
  115.  
  116.     return ret;
  117. }
  118.  
  119. BinaryReader.prototype.readType = function(typeDesc) {
  120.     var ret = { };
  121.  
  122.     for(var i = 0; i < typeDesc.length; ++i) {
  123.         var valName = typeDesc[i].name;
  124.         var value = undefined;
  125.  
  126.         switch(typeDesc[i].type) {
  127.             case "i64":
  128.                 value = this.readInt64();
  129.                 break;
  130.  
  131.             case "i32":
  132.                 value = this.readInt32();
  133.                 break;
  134.  
  135.             case "i16":
  136.                 value = this.readInt16();
  137.                 break;
  138.  
  139.             case "i8":
  140.                 value = this.readInt8();
  141.                 break;
  142.  
  143.             case "f32":
  144.                 value = this.readFloat();
  145.                 break;
  146.  
  147.             case "s":
  148.                 value = this.readString(typeDesc[i].strLen);
  149.                 break;
  150.  
  151.             case "v3":
  152.                 value = {
  153.                     x: this.readFloat(),
  154.                     y: this.readFloat(),
  155.                     z: this.readFloat()
  156.                 }
  157.                 break;
  158.  
  159.             case "v2":
  160.                 value = {
  161.                     x: this.readFloat(),
  162.                     y: this.readFloat()
  163.                 }
  164.                 break;
  165.         }
  166.  
  167.         ret[valName] = value;
  168.     }
  169.  
  170.     return ret;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment