ByteHelper.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. var gCByteHelper = cc.Class({
  2. ctor:function(){
  3. this.m_buffer = new ArrayBuffer(8);
  4. this.m_view = new DataView(this.m_buffer);
  5. },
  6. w1 :function(tag,index,src) {
  7. tag[index] = src;
  8. },
  9. w2 :function(tag,index,src) {
  10. tag[index] = src;
  11. tag[index+1] = src>>8;
  12. },
  13. w4 :function(tag,index,src) {
  14. tag[index+0] = src;
  15. tag[index+1] = src>>8;
  16. tag[index+2] = src>>16;
  17. tag[index+3] = src>>24;
  18. },
  19. wU4 :function(tag,index,src) {
  20. tag[index+0] = src;
  21. tag[index+1] = src>>8;
  22. tag[index+2] = src>>16;
  23. tag[index+3] = src>>24;
  24. },
  25. w8:function (tag,index,src) {
  26. var Low = (src&0xffffffff);
  27. var High = (src - Low) / Math.pow(2,32);
  28. //if(window.LOG_NET_DATA)console.log("w8 "+Low+" "+High)
  29. this.w4(tag,index,Low);
  30. this.w4(tag,index+4,High);
  31. },
  32. //写入float类型
  33. wf4 :function(tag,index,src){
  34. this.m_view.setFloat32(0, src);
  35. for(var i = 0;i<4;i++){
  36. tag[index+i] = this.m_view.getUint8(4-1-i)
  37. }
  38. },
  39. wd8 :function(tag,index,src){
  40. this.m_view.setFloat64(0, src);
  41. for(var i = 0;i<8;i++){
  42. tag[index+i] = this.m_view.getUint8(8-1-i)
  43. }
  44. },
  45. wStr:function (tag,index,src) {
  46. for(var i=0;i<=src.length;i++){
  47. tag[index+i*2] = src.charCodeAt(i)&0xFF;
  48. tag[index+i*2+1] = src.charCodeAt(i)>>8;
  49. }
  50. },
  51. rStr :function(tag,index){
  52. var strRlt = "";
  53. for(var i=0;i<=tag.length-index;i++){
  54. var wCode = tag[index+i*2] | (tag[index+i*2+1]<<8);
  55. if(wCode==0)break;
  56. strRlt += String.fromCharCode(wCode);
  57. }
  58. return strRlt;
  59. },
  60. r1 :function(tag,index){
  61. return tag[index];
  62. },
  63. r2 :function(tag,index){
  64. return tag[index]|(tag[index+1]<<8);
  65. },
  66. rU4:function (tag,index){
  67. for(var i = 0;i<4;i++){
  68. this.m_view.setUint8(i,tag[index + 4-1-i]);
  69. }
  70. return this.m_view.getUint32(0);
  71. },
  72. r4:function (tag,index){
  73. for(var i = 0;i<4;i++){
  74. this.m_view.setUint8(i,tag[index + 4-1-i]);
  75. }
  76. return this.m_view.getInt32(0);
  77. },
  78. rNum:function (tag,index,len){//,bUnum
  79. var bUnum=arguments[3]?arguments[3]:false;
  80. for(var i = 0;i<len;i++){
  81. this.m_view.setUint8(i,tag[index + len-1-i]);
  82. }
  83. if(len < 8){
  84. return this.m_view["getUint"+len*8](0);
  85. }else{
  86. var HighNum = this.m_view.getInt32(4) * Math.pow(2,32)
  87. var LowNum = this.m_view.getInt32(0)
  88. return HighNum + LowNum;
  89. }
  90. },
  91. r4U:function (tag,index){
  92. var rel0 = tag[index+0];
  93. var rel1 = tag[index+1]<<8;
  94. var rel2 = tag[index+2]<<16;
  95. var rel3 = tag[index+3]*Math.pow(2,24);
  96. return rel3+rel2+rel1+rel0;
  97. },
  98. //读取float类型 损失精度 .toFixed(2)
  99. rf4:function (tag,index){
  100. for(var i = 0;i<4;i++){
  101. this.m_view.setUint8(i,tag[index + 4-1-i]);
  102. }
  103. return this.m_view.getFloat32(0);
  104. },
  105. rd8:function (tag,index){
  106. for(var i = 0;i<8;i++){
  107. this.m_view.setUint8(i,tag[index + 8-1-i]);
  108. }
  109. return this.m_view.getFloat64(0);
  110. },
  111. r8 :function(tag,index){
  112. var HighNum = this.r4(tag,index+4) * Math.pow(2,32)
  113. var LowNum = this.rU4(tag,index);
  114. return HighNum + LowNum;
  115. },
  116. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  117. GetSize:function (Obj) {
  118. return this.TraverseStr(null,Obj,null,0);
  119. },
  120. Bytes2Str :function(Obj,tag,index) {
  121. if(index == null) index = 0;
  122. var len = this.TraverseStr('r',Obj,tag,index);
  123. if(Obj._name && window.LOG_NET_DATA) {
  124. Obj._Size = len;
  125. console.log(JSON.stringify(Obj))
  126. }
  127. return len;
  128. },
  129. Str2Bytes:function (Obj,tag) {
  130. if(Obj._name) if(window.LOG_NET_DATA)console.log(JSON.stringify(Obj))
  131. var index=arguments[2]?arguments[2]:0;
  132. var needRes = false;
  133. if (tag == null){
  134. needRes = true;
  135. tag = new Uint8Array(this.GetSize(Obj));
  136. }
  137. this.TraverseStr('w',Obj,tag,index);
  138. if(needRes) return tag;
  139. },
  140. //遍历结构体入口
  141. TraverseStr:function (inout,Obj,tag,index) {
  142. var strlen = 0;
  143. for(var i in Obj) {
  144. //跳过属性成员和非自定义成员
  145. if(i.indexOf("len_") == 0 || i.indexOf("index_") == 0 || i.indexOf("_") == 0) continue;
  146. //自定义信息
  147. var info = this.GetMemberInfo(Obj,i);//Obj["len_"+i]
  148. if(typeof (Obj[i]) == "object") {
  149. var strFun = 'Traverse';
  150. strFun += Array.isArray(Obj[i])?'Arr':'Str';
  151. strlen += this[strFun](inout,Obj[i],tag,index+strlen,info);
  152. } else {
  153. strlen += this.BaseRW(inout,Obj,i,tag,index+strlen,info);
  154. }
  155. }
  156. return strlen;
  157. },
  158. //遍历数组入口
  159. TraverseArr:function (inout,Obj,tag,index,info) {
  160. var arrlen = 0;
  161. for(var i =0;i<Obj.length;i++) {
  162. if(typeof (Obj[i]) == "object") {
  163. var strFun = 'Traverse';
  164. strFun += Array.isArray(Obj[i])?'Arr':'Str';
  165. arrlen += this[strFun](inout,Obj[i],tag,index+arrlen,info);
  166. } else {
  167. arrlen += this.BaseRW(inout,Obj,i,tag,index+arrlen,info);;
  168. }
  169. }
  170. return arrlen;
  171. },
  172. BaseRW :function(Op,Obj,name,tag,index,info) {
  173. try {
  174. if(Op != null) { // null 为 GetSize 跳过
  175. //拼写函数名
  176. var strFun = Op + info.strFun;
  177. //函数调用
  178. var Res = this[strFun](tag,index,Obj[name]);
  179. //读时赋值
  180. if(Op=='r') Obj[name] = Res;
  181. }
  182. } catch (error) {
  183. if(window.LOG_NET_DATA)console.log(error.toString())
  184. if(window.LOG_NET_DATA)console.log("BaseRW "+name +" -- "+strFun+" -- "+info.len)
  185. }
  186. return info.len;
  187. },
  188. GetMemberInfo:function (Obj, name) {
  189. var info = new Object();
  190. info.len = 0;//变量长度
  191. info.strFun = "";//调用方法拼写
  192. info.bFloat = (name.indexOf("f") == 0);
  193. info.bDouble = (name.indexOf("d") == 0 && name.indexOf("dw") != 0);
  194. if(info.bFloat) info.strFun = 'f';
  195. if(info.bDouble) info.strFun = 'd';
  196. if(name.indexOf("dw") == 0) info.strFun = 'U';
  197. //自定义长度
  198. if(Obj["len_"+name]){
  199. info.strFun = "Str";
  200. info.len = Obj["len_"+name];
  201. }else{
  202. if(name.indexOf("ll") == 0 || info.bDouble) info.len = 8; //longlong/double
  203. else if(name.indexOf("cb") == 0 || name.indexOf("b")== 0 || name.indexOf("by")== 0) info.len = 1;//byte
  204. else if(name.indexOf("w") == 0) info.len = 2;//WORD
  205. else info.len = 4;//long/DWORD/int
  206. info.strFun += info.len;
  207. }
  208. return info;
  209. },
  210. StrSameMemCopy:function(TagObj,SouceObj){
  211. for(var i in TagObj){
  212. if(i.indexOf("len_") == 0 || i.indexOf("index_") == 0 || i.indexOf("_") == 0) continue;
  213. if(SouceObj[i] == null) continue;
  214. TagObj[i] = SouceObj[i] ;
  215. }
  216. },
  217. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  218. });
  219. window.gCByte = new gCByteHelper();