Как проверить, закодирована ли строка в base64 или нет - PullRequest
165 голосов
/ 20 декабря 2011

Я хочу декодировать строку в кодировке base64, а затем сохранить ее в своей базе данных.Если вход не кодируется в base64, мне нужно выдать ошибку.Как я могу проверить, была ли строка кодирована в base64?

Ответы [ 18 ]

210 голосов
/ 20 декабря 2011

Вы можете использовать следующее регулярное выражение, чтобы проверить, закодирована ли строка в 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}==.

44 голосов
/ 08 января 2013

Если вы используете Java, вы можете использовать commons-codec library

import org.apache.commons.codec.binary.Base64;

String stringToBeChecked = "...";
boolean isBase64 = Base64.isArrayByteBase64(stringToBeChecked.getBytes());
42 голосов
/ 20 декабря 2011

Ну, вы можете:

  • Убедитесь, что длина кратна 4 символам
  • Убедитесь, что каждый символ находится в наборе A-Z, a-z, 0-9, +, / за исключением дополнения в конце, которое составляет 0, 1 или 2 символа '='

Если вы ожидаете, что будет быть base64, то вы, вероятно, можете просто использовать любую библиотеку, доступную на вашей платформе, чтобы попытаться декодировать ее в байтовый массив, бросая исключение, если это недопустимая база 64. Конечно, это зависит от вашей платформы.

12 голосов
/ 22 ноября 2013

Попробуйте вот так для 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"; 
}
8 голосов
/ 06 марта 2016

Начиная с Java 8, вы можете просто использовать java.util.Base64 , чтобы попытаться декодировать строку:

String someString = "...";
Base64.Decoder decoder = Base64.getDecoder();

try {
    decoder.decode(someString);
} catch(IllegalArgumentException iae) {
    // That string wasn't valid.
}
5 голосов
/ 09 марта 2013

Проверьте, чтобы увидеть ЕСЛИ длина строки кратна 4. В обратном направлении используется это регулярное выражение, чтобы убедиться, что все символы в строке являются символами base64.

\A[a-zA-Z\d\/+]+={,2}\z

Если библиотека, которую вы используете, добавляет новую строку для наблюдения правила 76 максимальных символов в строке, замените их пустыми строками.

5 голосов
/ 06 июля 2015
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');
}
4 голосов
/ 23 ноября 2012

Существует множество вариантов 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?
2 голосов
/ 07 марта 2018
/^([A-Za-z0-9+\/]{4})*([A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)$/

это регулярное выражение помогло мне идентифицировать base64 в моем приложении в rails, у меня была только одна проблема, это то, что он распознает строку «errorDescripcion», я генерирую ошибку, чтобы решить ее, просто проверьте длинустрока.

2 голосов
/ 28 октября 2015

Попробуйте это:

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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...