Base64でエンコードされた文字列をデコードし、データベースに保存したい。入力がBase64エンコードされていない場合、エラーをスローする必要があります。
文字列がBase64でエンコードされているかどうかを確認するにはどうすればよいですか?
test1234
、base64でエンコードされた有効な文字列であり、デコードすると数バイトが得られます。test1234
base64でエンコードされた文字列でないと結論付けるアプリケーションに依存しない方法はありません。
Base64でエンコードされた文字列をデコードし、データベースに保存したい。入力がBase64エンコードされていない場合、エラーをスローする必要があります。
文字列がBase64でエンコードされているかどうかを確認するにはどうすればよいですか?
test1234
、base64でエンコードされた有効な文字列であり、デコードすると数バイトが得られます。test1234
base64でエンコードされた文字列でないと結論付けるアプリケーションに依存しない方法はありません。
回答:
次の正規表現を使用して、文字列がbase64でエンコードされているかどうかを確認できます。
^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$
base64エンコーディングでは、文字セットは[A-Z, a-z, 0-9, and + /]
です。残りの長さが4未満の場合、文字列には文字が埋め込まれ'='
ます。
^([A-Za-z0-9+/]{4})*
文字列が0個以上のbase64グループで始まることを意味します。
([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$
3つのいずれかの形式で文字列の終了を意味します[A-Za-z0-9+/]{4}
、[A-Za-z0-9+/]{3}=
または[A-Za-z0-9+/]{2}==
。
abcd
は一致しますが、必ずしもi·
単なるabcd
入力のエンコードされた値を表すとは限りません
"pass"
バイトシーケンスにデコード完全に有効なbase64文字列、である0xa5
、0xab
と0x2c
。決定するコンテキストがない場合、なぜアプリオリにそれを破棄するのですか?
Javaを使用している場合、実際にはcommons-codecライブラリを使用できます
import org.apache.commons.codec.binary.Base64;
String stringToBeChecked = "...";
boolean isBase64 = Base64.isArrayByteBase64(stringToBeChecked.getBytes());
isArrayByteBase64(byte[] arrayOctet)
推奨。1.5の使用isBase64(byte[])
。2.0で削除されます。
stringToBeChecked="some plain text"
場合boolean isBase64=true
、Base64エンコードされた値ではありませんが設定されます。commons-codec-1.4のソースを読んBase64.isArrayByteBase64()
で、文字列の各文字がBase64エンコーディングで考慮されるのに有効であり、空白が許可されていることを確認するだけです。
よくできます:
base64 になると予想している場合は、プラットフォームで使用可能なライブラリを使用してバイト配列にデコードしようとすることができます。これが有効なbase 64でない場合は例外をスローします。これはプラットフォームによって異なります。もちろん。
Java 8以降では、java.util.Base64を使用して、文字列をデコードすることができます。
String someString = "...";
Base64.Decoder decoder = Base64.getDecoder();
try {
decoder.decode(someString);
} catch(IllegalArgumentException iae) {
// That string wasn't valid.
}
PHP5の場合は、このようにしてください
//where $json is some data that can be base64 encoded
$json=some_data;
//this will check whether data is base64 encoded or not
if (base64_decode($json, true) == true)
{
echo "base64 encoded";
}
else
{
echo "not base64 encoded";
}
これをPHP7に使用します
//$string parameter can be base64 encoded or not
function is_base64_encoded($string){
//this will check if $string is base64 encoded and return true, if it is.
if (base64_decode($string, true) !== false){
return true;
}else{
return false;
}
}
Returns FALSE if input contains character from outside the base64 alphabet.
base64_decode
var base64Rejex = /^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i;
var isBase64Valid = base64Rejex.test(base64Data); // base64Data is the base64 string
if (isBase64Valid) {
// true if base64 formate
console.log('It is base64');
} else {
// false if not in base64 formate
console.log('it is not in base64');
}
確認したIFの文字列の長さが4 Aftwerwardsの倍数であることを確認するために、この正規表現を使用するすべての文字列では、base64でエンコードされた文字です。
\A[a-zA-Z\d\/+]+={,2}\z
使用するライブラリが改行を追加して、1行あたり最大76文字のルールを遵守する場合は、それらを空の文字列に置き換えます。
Base64には多くのバリアントがあるので、文字列が処理したいバリアントに似ているかどうかを判断することを検討してください。そのように、あなたはインデックスとパディング文字に関して、以下の正規表現を調整する必要があります(つまり+
、/
、=
)。
class String
def resembles_base64?
self.length % 4 == 0 && self =~ /^[A-Za-z0-9+\/=]+\Z/
end
end
使用法:
raise 'the string does not resemble Base64' unless my_string.resembles_base64?
これを試して:
public void checkForEncode(String string) {
String pattern = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(string);
if (m.find()) {
System.out.println("true");
} else {
System.out.println("false");
}
}
文字列がbase64でエンコードされているかどうかを確認することはできません。その文字列がbase64エンコードされた文字列形式であるかどうかを検証することのみが可能です。つまり、それはbase64エンコードによって生成された文字列である可能性があります(文字列が正規表現に対して検証されるか、ライブラリを使用できるかどうかを確認するには、多くの場合、この質問に対する他の回答は、これをチェックするための良い方法を提供するため、詳細には触れません。
たとえば、string flow
は、base64でエンコードされた有効な文字列です。しかし、それが単なる文字列なのflow
か、英語の単語なのか、それともBase 64でエンコードされた文字列なのかを知ることは不可能です。~Z0
/^([A-Za-z0-9+\/]{4})*([A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)$/
この正規表現は、レール内のアプリケーションでbase64を識別するのに役立ちました。問題は1つだけでした。それは、文字列「errorDescripcion」を認識し、エラーを生成して、文字列の長さを検証するだけで解決することです。
errorDescription
有効なbase64文字列であり、バイナリシーケンスのバイト(16進数)にデコードします7a ba e8 ac 37 ac 72 b8 a9 b6 2a 27
。
これはPythonで機能します。
import base64
def IsBase64(str):
try:
base64.b64decode(str)
return True
except Exception as e:
return False
if IsBase64("ABC"):
print("ABC is Base64-encoded and its result after decoding is: " + str(base64.b64decode("ABC")).replace("b'", "").replace("'", ""))
else:
print("ABC is NOT Base64-encoded.")
if IsBase64("QUJD"):
print("QUJD is Base64-encoded and its result after decoding is: " + str(base64.b64decode("QUJD")).replace("b'", "").replace("'", ""))
else:
print("QUJD is NOT Base64-encoded.")
概要: Base64エンコードされている場合はtrueをIsBase64("string here")
返し、Base64エンコードされていない場合はfalseを返します。string here
string here
C# これは素晴らしいパフォーマンスです:
static readonly Regex _base64RegexPattern = new Regex(BASE64_REGEX_STRING, RegexOptions.Compiled);
private const String BASE64_REGEX_STRING = @"^[a-zA-Z0-9\+/]*={0,3}$";
private static bool IsBase64(this String base64String)
{
var rs = (!string.IsNullOrEmpty(base64String) && !string.IsNullOrWhiteSpace(base64String) && base64String.Length != 0 && base64String.Length % 4 == 0 && !base64String.Contains(" ") && !base64String.Contains("\t") && !base64String.Contains("\r") && !base64String.Contains("\n")) && (base64String.Length % 4 == 0 && _base64RegexPattern.Match(base64String, 0).Success);
return rs;
}
Console.WriteLine("test".IsBase64()); // true
このスニペットは、元のコンテンツ(チェックサムなど)の長さがわかっている場合に役立ちます。エンコードされたフォームが正しい長さであることを確認します。
public static boolean isValidBase64( final int initialLength, final String string ) {
final int padding ;
final String regexEnd ;
switch( ( initialLength ) % 3 ) {
case 1 :
padding = 2 ;
regexEnd = "==" ;
break ;
case 2 :
padding = 1 ;
regexEnd = "=" ;
break ;
default :
padding = 0 ;
regexEnd = "" ;
}
final int encodedLength = ( ( ( initialLength / 3 ) + ( padding > 0 ? 1 : 0 ) ) * 4 ) ;
final String regex = "[a-zA-Z0-9/\\+]{" + ( encodedLength - padding ) + "}" + regexEnd ;
return Pattern.compile( regex ).matcher( string ).matches() ;
}
前述の正規表現を使用してこれを試してください:
String regex = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
if("TXkgdGVzdCBzdHJpbmc/".matches(regex)){
System.out.println("it's a Base64");
}
...スペースがある場合、Base64にすることはできません。
String myString = "Hello World";
if(myString.contains(" ")){
System.out.println("Not B64");
}else{
System.out.println("Could be B64 encoded, since it has no spaces");
}
デコード時にASCII文字の文字列を取得した場合、その文字列はエンコードされていませんでした
(RoR)ルビ解:
def encoded?(str)
Base64.decode64(str.downcase).scan(/[^[:ascii:]]/).count.zero?
end
def decoded?(str)
Base64.decode64(str.downcase).scan(/[^[:ascii:]]/).count > 0
end
私はこれを使おうとします、はい、これは機能しています
^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$
ただし、少なくとも文字の終わりが=であることを確認する条件を追加しました=
string.lastIndexOf("=") >= 0
=
:Base64
使用している仕様は何ですか?どういうend of the character
意味ですか、そして非負はそれをどのようにlastIndexOf()
チェックしますか?