Chcę zdekodować ciąg zakodowany w standardzie Base64, a następnie zapisać go w mojej bazie danych. Jeśli dane wejściowe nie są zakodowane w standardzie Base64, muszę zgłosić błąd.
Jak mogę sprawdzić, czy ciąg znaków jest zakodowany w standardzie Base64?
test1234
jest prawidłowym ciągiem zakodowanym w standardzie base64, a kiedy go zdekodujesz, otrzymasz trochę bajtów. Nie istnieje niezależny od aplikacji sposób wnioskowania, którytest1234
nie jest łańcuchem zakodowanym w standardzie base64.Odpowiedzi:
Możesz użyć następującego wyrażenia regularnego, aby sprawdzić, czy łańcuch jest zakodowany w standardzie base64:
W kodowaniu base64 zestaw znaków to
[A-Z, a-z, 0-9, and + /]
. Jeśli długość reszty jest mniejsza niż 4, ciąg znaków jest uzupełniany'='
znakami.^([A-Za-z0-9+/]{4})*
oznacza, że ciąg zaczyna się od 0 lub więcej grup base64.([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$
Oznacza końce ciągów w jednej z trzech postaci:[A-Za-z0-9+/]{4}
,[A-Za-z0-9+/]{3}=
lub[A-Za-z0-9+/]{2}==
.źródło
abcd
będzie pasować, ale niekoniecznie reprezentuje zakodowaną wartośći·
raczej zwykłegoabcd
wejścia"pass"
jest doskonale prawidłowy ciąg base64, który dekoduje do sekwencji bajtów0xa5
,0xab
a0x2c
. Po co odrzucać to z góry , jeśli nie masz więcej kontekstu do podjęcia decyzji?Jeśli używasz Javy, możesz faktycznie użyć biblioteki kodeków commons
źródło
isArrayByteBase64(byte[] arrayOctet)
Przestarzałe. 1.5 UżycieisBase64(byte[])
zostanie usunięte w wersji 2.0.stringToBeChecked="some plain text"
wtedy ustawia,boolean isBase64=true
mimo że nie jest to wartość zakodowana w standardzie Base64. Odczytaj źródło dla commons-codec-1.4Base64.isArrayByteBase64()
, sprawdza tylko, czy każdy znak w ciągu jest poprawny do uwzględnienia w kodowaniu Base64 i dopuszcza białe znaki.Cóż, możesz:
Jeśli spodziewasz się, że będzie to base64, prawdopodobnie możesz po prostu użyć biblioteki dostępnej na platformie, aby spróbować ją zdekodować do tablicy bajtów, zgłaszając wyjątek, jeśli nie jest to poprawna baza 64. To zależy od twojej platformy, oczywiście.
źródło
Począwszy od Java 8, możesz po prostu użyć java.util.Base64, aby spróbować zdekodować ciąg:
źródło
Spróbuj tego w PHP5
Użyj tego dla PHP7
źródło
Returns FALSE if input contains character from outside the base64 alphabet.
base64_decodeźródło
Sprawdź, czy JEŻELI długość łańcucha jest wielokrotnością 4. Po drugiej stronie tego wyrażenia regularnego upewnij się, że wszystkie znaki w łańcuchu są znakami base64.
\A[a-zA-Z\d\/+]+={,2}\z
Jeśli używana biblioteka dodaje nowy wiersz jako sposób na przestrzeganie 76 maksymalnych znaków w linii, zastąp je pustymi łańcuchami.
źródło
Istnieje wiele wariantów Base64 , więc zastanów się nad ustaleniem, czy Twój ciąg znaków przypomina zmienną, którą spodziewasz się obsłużyć. Jako taka, może być konieczne, aby dostosować regex poniżej w odniesieniu do indeksu i wypełnienie znaków (czyli
+
,/
,=
).Stosowanie:
źródło
Spróbuj tego:
źródło
Nie można sprawdzić, czy łańcuch jest zakodowany w standardzie base64, czy nie. Sprawdzanie poprawności jest możliwe tylko wtedy, gdy ten ciąg ma format łańcucha zakodowany w standardzie base64, co oznaczałoby, że może to być ciąg utworzony przez kodowanie base64 (aby sprawdzić, czy łańcuch może być sprawdzony pod kątem wyrażenia regularnego lub można użyć biblioteki, wiele inne odpowiedzi na to pytanie zapewniają dobre sposoby na sprawdzenie tego, więc nie będę wchodził w szczegóły).
Na przykład ciąg
flow
jest prawidłowym ciągiem zakodowanym w standardzie base64. Nie można jednak ustalić, czy jest to zwykły ciąg, angielskie słowoflow
, czy też ciąg znaków zakodowany w podstawie 64~Z0
źródło
to wyrażenie regularne pomogło mi zidentyfikować base64 w mojej aplikacji w szynach, miałem tylko jeden problem, to znaczy, że rozpoznaje ciąg „errorDescripcion”, generuję błąd, aby go rozwiązać, po prostu zweryfikuj długość łańcucha.
źródło
errorDescription
Jest to prawidłowy ciąg base64, dekoduje go do binarnego sekwencji bajtów (w hex)7a ba e8 ac 37 ac 72 b8 a9 b6 2a 27
.Działa to w Pythonie:
Podsumowanie:
IsBase64("string here")
zwraca true, jeślistring here
jest zakodowany w standardzie Base64, i zwraca false, jeślistring here
NIE został zakodowany w standardzie Base64.źródło
C # To działa świetnie:
źródło
Console.WriteLine("test".IsBase64()); // true
Nie ma sposobu na odróżnienie łańcucha i kodowania base64, z wyjątkiem tego, że łańcuch w twoim systemie ma określone ograniczenia lub identyfikację.
źródło
Ten fragment kodu może być przydatny, gdy znasz długość oryginalnej treści (np. Suma kontrolna). Sprawdza, czy zakodowana forma ma prawidłową długość.
źródło
Jeśli RegEx nie działa i znasz styl formatu oryginalnego łańcucha, możesz odwrócić logikę, wyrażając wyrażenie regularne dla tego formatu.
Na przykład pracuję z plikami XML zakodowanymi w standardzie base64 i po prostu sprawdzam, czy plik zawiera prawidłowe znaczniki xml. Jeśli nie, mogę założyć, że jest dekodowany w standardzie base64. Nie jest to zbyt dynamiczne, ale działa dobrze w mojej małej aplikacji.
źródło
Działa to w Pythonie:
źródło
Wypróbuj to, używając wcześniej wspomnianego wyrażenia regularnego:
... Możemy również dokonać prostej weryfikacji, np. Jeśli ma spacje, to nie może być Base64:
źródło
(RoR) rozwiązanie rubinowe:
źródło
Próbuję tego użyć, tak, to działa
ale dodałem pod warunkiem, że przynajmniej koniec znaku to =
źródło
=
:Base64
jakiej specyfikacji używasz? Co toend of the character
znaczy i jak to nieujemne tolastIndexOf()
sprawdza?