Gostaria de base64
codificar e decodificar, mas não consegui encontrar nenhum suporte do iPhone SDK
. Como posso base64
codificar e decodificar com ou sem uma biblioteca?
ios
objective-c
base64
BlueDolphin
fonte
fonte
Respostas:
Este é um caso bom uso para Objective C categorias .
Para codificação Base64:
Para decodificação Base64:
fonte
Uma implementação muito, muito rápida, que foi transportada (e modificada / aprimorada) da biblioteca PHP Core para o código Objective-C nativo está disponível na classe QSStrings da QSUtilities Library . Fiz uma referência rápida: um arquivo de imagem (JPEG) de 5,3 MB levou <50ms para codificar e cerca de 140ms para decodificar.
O código para toda a biblioteca (incluindo os Métodos Base64) está disponível no GitHub .
Ou, como alternativa, se você deseja que o código seja apenas dos métodos Base64, eu o publiquei aqui:
Primeiro, você precisa das tabelas de mapeamento:
Para codificar:
Para decodificar:
fonte
strResult
no codificador parece ter vazado; ele só precisa de umfree()
no final (antes de retornar, mas depoisNSString stringWithCString
)encodeBase64WithData:
método, o primeiro parâmetro na chamada nãocalloc()
precisa ser incrementado em 1 para contabilizar o terminador nulo ('\0'
) adicionado no final?Historicamente, teríamos direcionado você a uma das muitas bibliotecas da base 64 de terceiros (como discutido nas outras respostas) para converter de dados binários em string da base 64 (e vice-versa), mas o iOS 7 agora tem a codificação da base 64 nativa (e expõe os métodos anteriormente privados do iOS 4, caso você precise oferecer suporte a versões anteriores do iOS).
Assim, para converter
NSData
naNSString
representação base 64, você pode usarbase64EncodedStringWithOptions
. Se você também tiver que suportar versões do iOS anteriores à 7.0, poderá:E para converter a base 64 de
NSString
volta paraNSData
você, você pode usarinitWithBase64EncodedString
. Da mesma forma, se você precisar oferecer suporte a versões do iOS anteriores à 7.0, poderá:Obviamente, se você não precisa de compatibilidade com versões anteriores do iOS anteriores à 7.0, é ainda mais fácil, basta usar
base64EncodedStringWithOptions
ouinitWithBase64EncodedString
, respectivamente, e não se incomodar com a verificação em tempo de execução das versões anteriores do iOS. De fato, se você usar o código acima quando seu destino mínimo for iOS 7 ou superior, receberá um aviso do compilador sobre os métodos descontinuados. Portanto, no iOS 7 e superior, você simplesmente converteria para a base 64 string com:e volte novamente com:
fonte
O iOS inclui suporte embutido para codificação e decodificação base64. Se você olhar,
resolv.h
verá as duas funçõesb64_ntop
eb64_pton
. A biblioteca Square SocketRocket fornece um exemplo razoável de como usar essas funções do objetivo-c.Essas funções são muito bem testadas e confiáveis - ao contrário de muitas das implementações que você pode encontrar em postagens aleatórias da Internet. Não se esqueça de vincular
libresolv.dylib
.fonte
Como esse parece ser o hit número um do google na codificação base64 e no iphone, tive vontade de compartilhar minha experiência com o snippet de código acima.
Funciona, mas é extremamente lento. Uma referência em uma imagem aleatória (0,4 mb) levou 37 segundos no iphone nativo. O principal motivo é provavelmente toda a mágica do OOP - char NSStrings, etc, que são liberados apenas após a codificação.
Outra sugestão postada aqui (ab) usa a biblioteca openssl, que também parece um exagero.
O código abaixo leva 70 ms - isso é uma aceleração de 500 vezes. Isso apenas codifica a base64 (a decodificação seguirá assim que a encontrar)
Eu deixei de fora o corte de linha porque não precisava, mas é trivial acrescentar.
Para quem está interessado em otimizar: o objetivo é minimizar o que acontece no loop principal. Portanto, toda a lógica para lidar com os últimos 3 bytes é tratada fora do loop.
Além disso, tente trabalhar com dados no local, sem copiar adicionalmente para / de buffers. E reduza qualquer aritmética ao mínimo.
Observe que os bits reunidos para procurar uma entrada na tabela não se sobreporiam quando deveriam ser unidos ou trocados. Uma grande melhoria, portanto, poderia ser o uso de 4 tabelas de pesquisa separadas de 256 bytes e eliminar as mudanças, assim:
É claro que você poderia ir muito além, mas isso está além do escopo aqui.
fonte
Na excelente melhoria do mvds, existem dois problemas. Altere o código para isso:
fonte
Melhor solução:
Existe uma função integrada no NSData
fonte
Que bom que as pessoas gostaram. O final do jogo foi um pouco defeituoso, devo admitir. Além de definir corretamente inp = 0, você também deve aumentar o tamanho do tmpbuf para 3, como
ou deixar de fora o orring de matérias-primas [inp + 2]; se tivéssemos um bruto [inp + 2]! = 0 para este pedaço, ainda estaríamos no circuito, é claro ...
De qualquer maneira, considere manter o bloco de pesquisa da mesa final idêntico ao do loop para maior clareza. Na versão final eu usei eu fiz
Para adicionar o ==
Desculpe, eu não verifiquei RFC e outras coisas, deveria ter feito um trabalho melhor!
fonte
No iOS8 e uso posterior
- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options
do NSDatafonte
fonte
Para uma atualização usar os
NSData (NSDataBase64Encoding)
métodos de categoria no iOS7, veja minha resposta aqui: https://stackoverflow.com/a/18927627/1602729fonte
Aqui está uma versão compacta do Objective-C como uma categoria no NSData. É preciso pensar um pouco ...
O preenchimento pode ser adicionado, se necessário, ampliando o escopo de 'byt' e anexando 'dest' com caracteres de 2 = "" antes de retornar.
Uma categoria pode ser adicionada ao NSString, assim:
fonte
O iOS possui métodos de codificação e decodificação Base64 internos (sem usar o libresolv) desde o iOS 4. No entanto, ele foi declarado apenas no iOS 7 SDK. A documentação da Apple indica que você pode usá-lo ao segmentar o iOS 4 e superior.
fonte
Aqui está um exemplo para converter um objeto NSData na Base 64. Também mostra como seguir o outro caminho (decodifique um objeto NSData codificado na base 64):
fonte
no iOS 7
fonte
Eu fiz isso usando a seguinte classe ..
Ao ligar para a chamada
É isso aí...
fonte
Eu acho que isso vai ser útil
}
fonte
Baixar Base64
Faça o seguinte código para converter uma imagem em base64
fonte
Conforme sua exigência, criei uma demonstração de amostra usando o Swift 4, na qual você pode codificar / decodificar string e imagem conforme sua exigência.
Também adicionei exemplos de métodos de operações relevantes.
fonte