2016-06-02 5 views
0

Ich habe mit dem seltsamsten Problem zu tun. Ich habe eine große Zeichenfolge (etwa 5 Millionen Bytes), die ich verkleinern möchte. Bevor ich es schrumpfen, ich versuche zu ‚rekonstruieren‘ als solche:Base 64 String wird magisch größer .. manchmal

for(var i = 0; i < data.length; i++){ 
    var bb64 = ""; 
    var sb64 = ""; 

    //the big-ass string (~5 million bytes) 
    bb64 = data[i]; 
    //initially one sixth of the big-ass string 
    sb64 = bb64.substring(0, bb64.length/6); 

    var start = bb64.length/6; 
    var end = bb64.length; 

    //for testing, re-add the remaining 5/6 characters 
    for(var x = start; x < end; x++){ 
     sb64 += bb64[x] 
    } 

    //theoretically, these should be the same for each iteration of i 
    console.log(bb64.length); 
    console.log(sb64.length); 

    /*actual results: 
    i = 0: 
    bb64:5458944 
    sb64:5458944 

    i = 1: 
    bb64:5563292 
    sb64:42651908 

    i = 2: 
    bb64:5555276 
    sb64:42590452 
    */ 
    } 

Getestet habe ich es dann mit anderen Big-ass-Strings (~ 3.000.000 Byte), und die Ergebnisse waren:

i = 0: 
bb64:3132968 
sb64:24019424 

i = 1: 
bb64:3635916 
sb64:3635916 

i = 2: 
bb64:3791560 
sb64:29068632 

Jeder hat beliebig Ahnung, was zum Teufel ist los ..?

Vielen Dank im Voraus!

+1

Sie runden den Wert der Länge/6 nicht ab? Sie gehen über das Zahlenmaximum hinaus? – Kulvar

+0

hahahha was zum Teufel !! Ich habe gerade gerundet und es hat funktioniert. Das sollte aber keinen Unterschied machen - sehen Sie sich den Größenunterschied an, es ist eine Größenordnung! Bitte poste dies als Antwort, damit ich es annehmen kann – Jona

+1

Es ist fertig.^_^ – Kulvar

Antwort

1

Die Division "length/6" ist nicht gerundet, da ein nicht gerundeter Wert als Schlüssel zu unvorhersehbaren Ergebnissen führt.

+2

das Ergebnis ist sehr vorhersehbar, es "ersetzt" jedes Zeichen in der Schleife (die letzten 5 Sechstel der Eingabe) mit "undefined", aka 9 Zeichen. 'Math.floor (5563292/6) + Math.ceil (5563292 * 5/6) * 9 === 42651908' – Thomas

+0

@Thomas Richtig! Ich tippte genau das Gleiche! –