2017-01-16 4 views
1

저는 자바 스크립트에 익숙하지 않지만 큰 정적 2D 정수 배열 (값이 255보다 큰 경우)을 base64 문자열로 보내고 받아야합니다. 본질적인). 현재로서는이 간단하고 비효율적 인 솔루션으로 요소 단위 및 수동으로 문자열을 변환하는 방법을 생각해 냈습니다. 이해하는 한 많은 데이터를 복사해야하고 매우 느리게 처리해야합니다.Javascript : 2D 정수 배열을 base64 문자열로 변환 후

가능한 경우 Node.js 등과 같은 큰 측면 라이브러리를 사용하지 않고보다 효율적인 방법으로 수행 할 수 있습니까?

 //----------- serializing/deserializing procedures 

    //encoding int contours array to be sent as base64 string 
    function getBase64IntArray(arr) { 

     var width = arr.length; 
     //This works given the inner arrays length never changes. 
     var height = arr[0].length; 
     //string that would contain data 
     var str = width.toString()+","+height.toString()+","; 

     for(var x = 0; x < height; x++) { 
      for(var y = 0; y < width; y++) { 
       str = str + arr[x][y].toString() + ","; 
      } 
     }  

     var str64 = btoa(str); 
     return str64; 
    }//getBase64IntArray 

    //deconding this string back to array 
    function getIntArrayfromBase64(str64) { 

     var str = atob(str64); 
     //first occurence of "," 
     var width_str = str.substr(0,str.indexOf(',')); 
     str = str.substr(str.indexOf(',')+1); // cut the beginning 
     //again first occurence of "," 
     var height_str = str.substr(0,str.indexOf(',')); 
     str = str.substr(str.indexOf(',')+1); // cut the beginning 

     var width = parseInt(width_str); 
     var height = parseInt(height_str); 

     //declare new array and fill it 
     var arr = new Array(height); 
     var curr_str = ""; 

     for(var x = 0; x < height; x++) { 

      arr[x] = new Array(width); 

      for(var y = 0; y < width; y++) { 
       //first occurence of "," 
       curr_str = str.substr(0,str.indexOf(',')); 
       // cut the beginning 
       str = str.substr(str.indexOf(',')+1); 
       arr[x][y]=parseInt(curr_str); 
      } 
     } 

     return arr; 

    }// getIntArrayfromBase64 

보내기/받기 작품 :

//----------- example usage 
    function send(){ 
    //encoding to base64     
    var arr = [ 
      [1, 2], 
      [3, 4] 
    ]; 

    var base64 = getBase64IntArray(arr);     
    webSocket.send(base64);    
    } 

    webSocket.onmessage = function(event){ 

    //reading array as base64 string 
    var arr = getIntArrayfromBase64(event.data); 
    var width = arr.length; 
    var height = arr[0].length; 

    writeResponse("Received "+width+" "+height+" "+arr[0][0]+arr[1][1]); 
    }; 

답변

1

어떻게 JSON을 통과 어떻습니까? JSON은 와이어 형식에 최소한의 오버 헤드를 추가하지만 기본적으로 구현되기 때문에 직렬화/직렬화가 빠릅니다.

function getBase64IntArray(arr) { return btoa(JSON.stringify(arr)) }

function getIntArrayfromBase64(str64) { return JSON.parse(atob(str64)) }

+0

감사합니다! 그것은 작동! – Slowpoke

+0

또 하나의 질문 : C++에서이 데이터를 디코딩 할 수있는 방법이 있습니까? 변환 알고리즘이란 무엇입니까? – Slowpoke

+0

https://github.com/nlohmann/json –