2011-11-17 11 views
6

Proszę mi pomóc rozwiązać ten problem:W systemie Android, jak łączyć łańcuchy kodowane base64?

Mam dwa ciągi dla poczty-id i hasło jak

String name = "[email protected]"; 
String pass = "abc"; 

zakodować tych dwóch do Base64 ciąg jak

String encoded_name = new String(Base64.encode(name.getBytes(), 0)); 
String encoded_pass = new String(Base64.encode(pass.getBytes(), 0)); 

i potrzebuję połączyć te dwie zakodowane ciągi z przestrzenią taką jak

String merge = encoded_name + " " + encoded_pass; 

Sprawdziłem ten ciąg w konsoli przez

System.out.print("Concatenate string= " + merge); 

ale w konsoli otrzymuję wynik w dwóch liniach jak ten

11-18 00:25:29.898: INFO/System.out(1244): Merge= eHl6QGdtYWlsLmNvbQ== 
11-18 00:25:29.908: INFO/System.out(1244): YWJj 

Dlaczego to happing wynik jest niespodziewany dla mnie dlaczego nie jest drukowanie w jednej linii. pomóż mi rozwiązać ten problem.

Dzięki

+0

nigdy nie używany System.out pokazać informacje w android, można spróbować z klasą Log ? Log.e ("BASE64", scalanie); –

+0

Nie dokonane przez Log.e –

+0

Sprawdź, czy Twój ciąg Base64 kończy się znakiem "nowej linii", lub usuń go za pomocą * String.trim() *. – JimmyB

Odpowiedz

20

Powinieneś używać flagi NO_WRAP zgodnie z opisem w Docs, klasa Base64 nie doda dodatkowych linii dodatkowych.

no_wrap: flaga Koder nieco pominąć wszystkie końca linii (to znaczy, sygnał wyjściowy będzie na jednej długiej linii).

Więc zmienić swoje linie na następujące kwestie:

wyjście
String encoded_name = new String(Base64.encode(name.getBytes(), Base64.NO_WRAP)); 
String encoded_pass = new String(Base64.encode(pass.getBytes(), Base64.NO_WRAP)); 

To będzie następujący:

11-17 19:16:51.283: INFO/System.out(354): Concatenate string= eHl6QGdtYWlsLmNvbQ== YWJj 
0

Spójrz na this doc sekcja mim stwierdza, że ​​

MIME nie określa stałą długość dla Base64 kodowanych linii, ale ma określić maksymalną długość linii 76 znaków. Dodatkowo określa, że ​​wszelkie dodatkowe znaki alfabetyczne muszą zostać zignorowane przez zgodny dekoder, chociaż większość implementacji używa pary nowej linii CR/LF do rozdzielania zakodowanych linii.

Należy jedynie rozważyć usunięcie Ostatni znak swojej pierwszej bazy 64 łańcucha, wydaje się być \ n (sposób bardziej ogólny byłoby przetestować pogoda jest lub nie).

Pozdrowienia, Stéphane

1

Proszę spojrzeć na Android Api reference Document. Rozwiąże wszystkie inne zapytania dotyczące kodowania/dekodowania Base64 w systemie Android.

jeszcze jeden skuteczny sposób na rozwiązanie problemu:

String encoded_name = Base64.encodeToString(name.getBytes("utf-8"), Base64.NO_WRAP); 
String encoded_pass = Base64.encodeToString(pass.getBytes("utf-8"), Base64.NO_WRAP); 

się umieścić: -

11-17 10:55:27.492: V/BASE-64-.encodeToString(525): eHl6QGdtYWlsLmNvbQ== YWJj 
Powiązane problemy