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}==)$
세 가지 형태 중 하나의 문자열 끝을 의미 [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 library를 사용할 수 있습니다.
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
됩니다. 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');
}
확인 경우 문자열의 길이가 Aftwerwards가 있는지 확인하기 위해 정규식을 사용하는 4의 배수 인 모든 문자 문자열을 base64로 문자는가.
\A[a-zA-Z\d\/+]+={,2}\z
사용하는 라이브러리가 줄당 76 개의 최대 문자 규칙을 준수하는 방법으로 개행을 추가하는 경우 빈 문자열로 바꾸십시오.
이 시도:
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
인지 영어 단어 인지 또는 기본 64 인코딩 문자열인지 알 수 없습니다.~Z0
/^([A-Za-z0-9+\/]{4})*([A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)$/
이 정규 표현식은 레일에서 응용 프로그램의 base64를 식별하는 데 도움이되었지만 한 가지 문제 만있었습니다. 문자열 "errorDescripcion"을 인식하고 오류를 생성하여 문자열의 길이 만 확인하는 것입니다.
errorDescription
유효한 base64 문자열이며 바이트의 이진 시퀀스 (16 진수)로 디코딩합니다 7a ba e8 ac 37 ac 72 b8 a9 b6 2a 27
.
이것은 파이썬에서 작동합니다.
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()
확인합니까?