PHP base64_decode C # equivalente
Pergunta
Eu estou tentando criar um script de php mímico que faça o seguinte:
- substituir um GET do vaiable cada espaço com um sinal de + ($ var = preg_replace ( "/ \ s /", "+", $ _ GET [ 'var']);)
- decodificação de Base64: base64_decode ($ var);
1 i adicionado um método executar uma base64 decodificação:
public string base64Decode(string data)
{
try
{
System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
System.Text.Decoder utf8Decode = encoder.GetDecoder();
byte[] todecode_byte = Convert.FromBase64String(data);
int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
char[] decoded_char = new char[charCount];
utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
string result = new String(decoded_char);
return result;
}
catch (Exception e)
{
throw new Exception("Error in base64Decode" + e.Message);
}
}
mas nas encostas que UTF-8 não está fazendo o trabalho, então eu tentei o mesmo método, mas com uma UTF-7
public string base64Decode(string data)
{
try
{
System.Text.UTF7Encoding encoder = new System.Text.UTF7Encoding();
System.Text.Decoder utf7Decode = encoder.GetDecoder();
byte[] todecode_byte = Convert.FromBase64String(data);
int charCount = utf7Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
char[] decoded_char = new char[charCount];
utf7Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
string result = new String(decoded_char);
return result;
}
catch (Exception e)
{
throw new Exception("Error in base64Decode" + e.Message);
}
}
uma última coisa a dizer, a decodificação php sucesso contém sinais especiais, como o sinal registrado e sinal de marca, mas a versão C # não!
Além disso, faz base64_decode php afetada pela linguagem servidor?
Solução
UTF-7 é muito pouco provável que seja o que você quer. Você realmente precisa saber que codificação PHP está usando. É pode estar usando a codificação padrão para o seu sistema. Felizmente é muito mais fácil de decodificação do que você está fazendo isso:
public static string base64Decode(string data)
{
byte[] binary = Convert.FromBaseString(data);
return Encoding.Default.GetString(binary);
}
Não há nenhuma necessidade de explicitamente mexer com Encoder
:)
Outra possibilidade é que o PHP está usando ISO Latin 1, que é o código página 28591:
public static string base64Decode(string data)
{
byte[] binary = Convert.FromBaseString(data);
return Encoding.GetEncoding(28591).GetString(binary);
}
O manual do PHP inutilmente apenas diz: "Antes do PHP 6, um personagem é o mesmo que um byte Ou seja, há exatamente 256 caracteres diferentes possíveis.". É uma pena que não diz o que cada byte realmente através ...