Pergunta

Recebo um erro de caractere inválido Base64 mesmo que eu não deveria.

O programa tem um arquivo XML e exporta-lo para um documento. Se o usuário quiser, ele irá comprimir o arquivo também. A compressão funciona bem e retorna uma string Base64 que está codificado em UTF-8 e gravados em um arquivo.

Quando é hora de recarregar o documento para o programa eu tenho que verificar se o seu comprimido ou não, o código é simplesmente:

byte[] gzBuffer = System.Convert.FromBase64String(text);
return "1F-8B-08" == BitConverter.ToString(new List<Byte>(gzBuffer).GetRange(4, 3).ToArray());

Ele verifica o início da cadeia para ver se ele tem o código GZips nele.

Agora, a coisa é, todos os meus testes trabalho. Eu tomo uma corda, comprimi-lo, descompactá-lo e compará-lo com o original. O problema é quando eu chegar a string retornada de um conjunto de registos ADO. A string é exatamente o que foi escrito para o arquivo (com a adição de um "\ 0" no final, mas eu não acho que qualquer coisa mesmo faz, mesmo cortado fora ele ainda joga). I até mesmo copiar e colar toda a cadeia em um método de ensaio e comprimir / descomprimir isso. Funciona bem.

Os testes vão passar, mas o código irá falhar usando exatamente a mesma seqüência? A única diferença é em vez de apenas declarar uma seqüência regular e passá-la na estou tendo um retornou de um conjunto de registros.

Algumas ideias sobre o que estou fazendo de errado?

Foi útil?

Solução

Você diz

A seqüência é exatamente o que foi escrito para o arquivo (com a adição de um "\ 0" no final, mas eu não acho que que mesmo faz nada).

Na verdade, ele faz alguma coisa (que faz com que seu código para jogar um FormatException: "caractere inválido em uma seqüência de Base-64") porque o Convert.FromBase64String não considera "\ 0" para ser um personagem Base64 válido.

  byte[] data1 = Convert.FromBase64String("AAAA\0"); // Throws exception
  byte[] data2 = Convert.FromBase64String("AAAA");   // Works

Solução:. Livrar-se do término de zero (.Trim("\0") Talvez chamada)

Notas :

MSDN docs para Convert.FromBase64String dizer que vai jogar um FormatException quando

O comprimento s, ignorando o espaço em branco caracteres, não é zero ou um múltiplo de 4.

-ou-

O formato de s é inválido. s contém um não-base de 64 caracteres, mais do que dois caracteres de preenchimento, ou um caractere de espaço não-brancos entre os caracteres de preenchimento.

e que

A base 64 dígitos em ordem ascendente de zero são os caracteres maiúsculos 'A' a 'Z', caracteres minúsculos 'um' para 'z', os numerais de '0' a '9', e a símbolos '+' e '/'.

Outras dicas

Se nula char é permitido ou não realmente depende do codec base64 em questão. imprecisão dado de padrão Base64 (não há especificação exata não autorizada), muitas implementações iria simplesmente ignorá-la como espaço em branco. E, em seguida, bandeira lata outros, como um problema. E aqueles buggiest não notaria e felizmente tentar decodificá-lo ...: - /

Mas soa c # implementação não gosta (que é uma abordagem válida) para que se removê-lo ajuda, que deve ser feito.

Um menor comentário adicional: UTF-8 não é um requisito, ISO-8859-x aka latino-x, e 7-bit ASCII iria funcionar tão bem. Isto porque Base64 foi especificamente concebido para usar somente subconjunto de 7 bits que trabalha com todas as codificações compatíveis 7-bit ASCII.

Se a remoção \ 0 do final de string é impossível, você pode adicionar seu próprio personagem para cada corda você codificar, e removê-lo na decodificação.

Uma pegadinha a ver com a conversão de Base64 de uma string é que algumas funções de conversão de usar os "dados: image / jpg; base64," anteriores. E outros só aceitam os dados reais

string stringToDecrypt = HttpContext.Current.Request.QueryString.ToString()

// mudança corda stringToDecrypt = HttpUtility.UrlDecode (HttpContext.Current.Request.QueryString.ToString ())

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top