2017-01-29 6 views
0
Eigentlich

Forming erfordern IBase64-Strings von gleicher Länge für jede gegebene Größe Datei

Ein gültiger Base64 Stringwert, der den Block identifiziert. Vor der Kodierung muss die Zeichenfolge kleiner oder gleich 64 Byte groß sein.

Für einen gegebenen Blob muss die Länge des für den Parameter blockid angegebenen Werts für jeden Block dieselbe Größe haben.

Beachten Sie, dass die Base64-Zeichenfolge URL-codiert sein muss.

wie in https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/put-block angegeben.

Dafür konvertiere ich einige C# -Code nach Java. Und ich habe Probleme mit dieser Codezeile

//create a blockID from the block number, add it to the block ID list 
         //the block ID is a base64 string 
String blockId = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format("BlockId{0}",blockNumber.ToString("0000000")))); 

ich unten versucht:

String str = "BlockId"+blockNumber; 
String blockId = Base64.getEncoder().encodeToString(("BlockId"+(blockNumber+"")).getBytes("utf-8")); 

Aber ich bin nicht in der Lage zu verstehen, was „0000000“ als ein Argument zu ToString tun und was ist sein Äquivalent in Java.

Und auch wie kann ich die zweite Bedingung erfüllen, dass die Länge der Blockid jedes Blocks oder Zufallsdatei in JAVA identisch sein sollte. Da die Dateigröße variieren kann.

+0

Was ist 'blockNumber'? Wie wird es in der C# Version deklariert? –

Antwort

2

In C# hat toString() mehrere überladene Versionen. Derjenige, der einen String Parameter akzeptiert, verwendet das String, um das Format anzugeben. In diesem Fall wird die Nummer mit genügend Nullen aufgefüllt, um sicherzustellen, dass es 7 Ziffern gibt. In Java können Sie String.format() verwenden, um dasselbe Verhalten zu erhalten. Details zur Formatzeichenfolgensyntax finden Sie unter the format string documentation.

0

Der Parameter "00000000" teilt der Format-Methode mit, eine achtstellige Zeichenfolge mit führenden 0s zu erstellen. Siehe this MSDN documentation

Für das Problem mit fester Blockgröße könnten Sie mit = Zeichen füllen. Wenn Sie Ihre Daten lesen, entfernen Sie alle = Zeichen und füllen Sie sie dann bis zu einer Länge von mehreren von drei. Siehe here

2

In Ihrem C# Beispielcode blockNumber.ToString("0000000") nur Pads blockNumber mit führenden Nullen auf eine Zeichenfolge fester Länge der Größe 7. Sie das gleiche in Java mit String.format() erreichen können.

Um diese Zeichenfolge mit dem richtigen Base64 Schema codieren, die in URLs verwendet werden können, Sie Base64.getUrlEncoder() seit Java 8.

Ein komplettes Java 8 Beispiel verwenden können:

long blockNumber = 123; 

// left pad block number with zeros to a fixed length of 7 
String fixedLengthBlockNumber = String.format("%07d", blockNumber); 

// Base64 encode using the "URL and Filename safe Base64 Alphabet" 
String blockId = Base64.getUrlEncoder().encodeToString(fixedLengthBlockNumber.getBytes("utf-8")); 

Die blockNumber ist nur ein Nummer, die Sie Ihren Blöcken zuweisen. Es kann oder kann nicht vom Blockinhalt selbst abgeleitet werden. Wenn sie aus dem Blockinhalt abgeleitet ist (z. B. über die Prüfsumme MD5), erfüllt die Prüfsumme selbst bereits das Kriterium der festen Länge und Sie müssen die Zahl sogar nicht auffüllen.

+0

Aber das Problem mit oben, das ich habe, ist, dass, wenn Sie Zahl geben, die dann 7 Zahl ex "99888877" ist, es so drucken wird, wie es mit dem Fehler ist. –

+0

'Zeichenfolge.format() 'druckt nichts, es gibt nur einen String zurück. Wenn Ihre Nummer mehr Ziffern als die Fülllänge im Formatmuster hat, wird die Zahl nicht aufgefüllt. –

Verwandte Themen