Patrzyłem na Pako, aby zmienić moją bazę64 do JSON, które doskonale pracuję. Ale jak mogę go odwrócić?

Użyłem online JSON do Base64, ale wyniki różnią się od mojego oryginalnego Base64, które pierwotnie wprowadzam.

Zostawiłem próbkę mojego Base64 w komentarzu na tym fragmencie z jego wyjściem (także skomentowany). Czy mogę używać Pako, aby odwrócić go do pierwotnego stanu?

//eNqrVsoozcnxdFGyMjQwtjQwN9dRSq0oSC0qcSrNzElRskpLzClO1VEqT00syM8rVrKKNjUwMInVUSouSE3OBMpBRCxBItmZYAWGBgZmIINiawE68xw1
//{"hullID":1039077,"expertBuild":false,"weapons":[5004],"specials":[5009],"skins":[10069077]}   
    
submit.onclick = function(){
  // Get some base64 
  var b64Data     = document.getElementById("KixCode").value;;
  // Decode base64 (convert ascii to binary)
  var strData     = atob(b64Data);
  // Convert binary string to character-number array
  var charData    = strData.split('').map(function(x){return x.charCodeAt(0);});
  // Turn number array into byte-array
  var binData     = new Uint8Array(charData);
  // Pako magic
  var data        = pako.inflate(binData);
  // Convert gunzipped byteArray back to ascii string:
  var strData     = String.fromCharCode.apply(null, new Uint16Array(data));
  // Output 
  var KixCode = strData
  document.getElementById("output").innerText = KixCode;
}
<div>
<label for="KixCode">Kix Code: </label><input id="KixCode" type="text" value="eNqrVsoozcnxdFGyMjQwtjQwN9dRSq0oSC0qcSrNzElRskpLzClO1VEqT00syM8rVrKKNjUwMInVUSouSE3OBMpBRCxBItmZYAWGBgZmIINiawE68xw1"/><br /><br />
<button id="submit">Submit</button>
</div>
<p>
<span id="output"></span>
</p>

<script src="https://rawgit.com/nodeca/pako/master/dist/pako.js"></script>
1
Wayne 7 październik 2020, 19:26

1 odpowiedź

Najlepsza odpowiedź

Możesz użyć metody Pako {X0}}. Problem polega na tym, że zakodowane dane mają pewne informacje nagłówkowe, które dają informacji o tym, jak wykonano kompresję. Ta informacja nie jest zawarta w wyniku dekompresji ({X1}}).

Twoje przykładowe dane okazuje się sprężone na poziomie 7, ale domyślne dla deflate Metoda jest poziom 6. powoduje różnicę w drugim bajcie zwracanym przez deflate w porównaniu z drugim bajtem danych, które zostały przekazane inflate. Ten drugi bajt jest częścią Nagłówek.

NB: Nie jestem dobrze zorientowany w tym wszystkim - po prostu podaję powyższe do dalszej analizy. Ważną rzeczą jest to, że opcje wpływają na wykonywanie kompresji.

Dla twojego przykładu, przekazując opcję { level: 7 } do metody deflate spowoduje, że wynik, taki jak minął pierwotnie do inflate:

submit.onclick = function(){
    var b64Data     = document.getElementById("KixCode").value;
    var strData     = atob(b64Data);
    var charData    = Array.from(strData, x => x.charCodeAt(0));
    var binData     = new Uint8Array(charData);
    var data        = pako.inflate(binData);
    var KixCode     = String.fromCharCode.apply(null, new Uint16Array(data));
    document.getElementById("output").innerText = KixCode;
    
    // Reverse operation
    var data2       = Array.from(KixCode, c => c.charCodeAt());
    var binData2    = pako.deflate(data2, { level: 7 }); // <-- option
    var charData2   = [...binData2];
    var strData2    = charData2.map(i => String.fromCharCode(i)).join("");
    var b64Data2    = btoa(strData2);
    
    document.getElementById("verif").innerText = b64Data2 === b64Data ? "Reversal is correct" : "Reversal is not the same";
}
<div><label for="KixCode">Kix Code: </label><input id="KixCode" type="text" style="width: 100%" value="eNqrVsoozcnxdFGyMjQwtjQwN9dRSq0oSC0qcSrNzElRskpLzClO1VEqT00syM8rVrKKNjUwMInVUSouSE3OBMpBRCxBItmZYAWGBgZmIINiawE68xw1"></div>
<div><button id="submit">Submit</button></div>
<div id="output"></div>
<div id="verif"></div>


<script src="https://cdnjs.cloudflare.com/ajax/libs/pako/1.0.11/pako.min.js" integrity="sha512-euWc/Qv8Kp0CbTX1M+Q3BvUyoOaq9Au50TT7vz3MFf5ver39ybq6zV+RngDY8eN8AIQFigxjwYv6jhoP546vfQ==" crossorigin="anonymous"></script>
2
trincot 7 październik 2020, 17:48