2016-04-07 17 views
2

Titel sagt alles. Ich habe eine Jquery serialisierten Daten, die wie folgt aussieht:JavaScript- Array-Puffer in String umwandeln

tarid=value&tarname=value&sel=3 

Und ich möchte es Arraybuffer konvertieren. Danach muss ich es auch wieder in seine ursprüngliche Form zurückdrehen. Also wie kann ich das tun?

+0

Siehe http://stackoverflow.com/a/25652412/ – guest271314

Antwort

9

ist das genug?

function stringToArrayBuffer(str){ 
    if(/[\u0080-\uffff]/.test(str)){ 
     throw new Error("this needs encoding, like UTF-8"); 
    } 
    var arr = new Uint8Array(str.length); 
    for(var i=str.length; i--;) 
     arr[i] = str.charCodeAt(i); 
    return arr.buffer; 
} 

function arrayBufferToString(buffer){ 
    var arr = new Uint8Array(buffer); 
    var str = String.fromCharCode.apply(String, arr); 
    if(/[\u0080-\uffff]/.test(str)){ 
     throw new Error("this string seems to contain (still encoded) multibytes"); 
    } 
    return str; 
} 

oder haben Sie echte UTF-8 müssen Codierung

Edit: volle UTF-8-Unterstützung

Beware/Haftungsausschluss: dieser Code nicht einigen ausländischen implementaion eines getestet gegen UTF-8-Encoder oder -Decoder. Es kann zu falschen Ergebnissen führen.

TESTEN SIE ES SELBST, bevor Sie es in der Produktion verwenden!

function stringToArrayBuffer(str){ 
    if(/[\u0080-\uffff]/.test(str)){ 
     var arr = new Array(str.length); 
     for(var i=0, j=0, len=str.length; i<len; ++i){ 
      var cc = str.charCodeAt(i); 
      if(cc < 128){ 
       //single byte 
       arr[j++] = cc; 
      }else{ 
       //UTF-8 multibyte 
       if(cc < 2048){ 
        arr[j++] = (cc >> 6) | 192; 
       }else{ 
        arr[j++] = (cc >> 12) | 224; 
        arr[j++] = ((cc >> 6) & 63) | 128; 
       } 
       arr[j++] = (cc & 63) | 128; 
      } 
     } 
     var byteArray = new Uint8Array(arr); 
    }else{ 
     var byteArray = new Uint8Array(str.length); 
     for(var i = str.length; i--;) 
      byteArray[i] = str.charCodeAt(i); 
    } 
    return byteArray.buffer; 
} 

function arrayBufferToString(buffer){ 
    var byteArray = new Uint8Array(buffer); 
    var str = "", cc = 0, numBytes = 0; 
    for(var i=0, len = byteArray.length; i<len; ++i){ 
     var v = byteArray[i]; 
     if(numBytes > 0){ 
      //2 bit determining that this is a tailing byte + 6 bit of payload 
      if((cc&192) === 192){ 
       //processing tailing-bytes 
       cc = (cc << 6) | (v & 63); 
      }else{ 
       throw new Error("this is no tailing-byte"); 
      } 
     }else if(v < 128){ 
      //single-byte 
      numBytes = 1; 
      cc = v; 
     }else if(v < 192){ 
      //these are tailing-bytes 
      throw new Error("invalid byte, this is a tailing-byte") 
     }else if(v < 224){ 
      //3 bits of header + 5bits of payload 
      numBytes = 2; 
      cc = v & 31; 
     }else if(v < 240){ 
      //4 bits of header + 4bit of payload 
      numBytes = 3; 
      cc = v & 15; 
     }else{ 
      //UTF-8 theoretically supports up to 8 bytes containing up to 42bit of payload 
      //but JS can only handle 16bit. 
      throw new Error("invalid encoding, value out of range") 
     } 

     if(--numBytes === 0){ 
      str += String.fromCharCode(cc); 
     } 
    } 
    if(numBytes){ 
     throw new Error("the bytes don't sum up"); 
    } 
    return str; 
} 
+0

ja, utf-8 ist, was ich will –

+1

Der entsandte Code ist nur ein winziger Teilmenge von UTF-8, der Teil, wo es entspricht mit ANSI; (im Grunde die englischen Zeichen + die am häufigsten verwendeten Symbole) Sobald Sie eine Fremdsprache oder etwas mehr "Phantasie" -Symbole abdecken wollen, wird die erste Implementierung es nicht mehr abdecken. Ich habe eine vollständige UTF-8-Version hinzugefügt, aber es wird nicht gegen eine Referenzimplementierung getestet, um wirklich sicherzustellen, dass die En-/Decodierung richtig ist. – Thomas

+0

Der erste Teil Ihrer Antwort ist alles was ich will. Alles andere (vor allem in den anderen q/a "Konvertieren zwischen Strings und ArrayBuffers") ist genau wie ..... alles was ich will ist eine Zeichenfolge zu sehen! Also vielen Dank für die knappe Beantwortung der Frage und um klar zu machen, wo die Antwort endet und zusätzliche Details (die ich nicht brauche :-) beginnt. – user1863152