Saya ingin melakukan base64
encoding dan decoding, tetapi saya tidak dapat menemukan dukungan dari iPhone SDK
. Bagaimana saya bisa melakukan base64
encoding dan decoding dengan atau tanpa perpustakaan?
ios
objective-c
base64
BlueDolphin
sumber
sumber
Jawaban:
Ini adalah kasus penggunaan yang baik untuk C Objective kategori .
Untuk pengkodean Base64:
Untuk decoding Base64:
sumber
Implementasi yang benar-benar sangat cepat yang porting (dan dimodifikasi / ditingkatkan) dari perpustakaan PHP Core ke kode Objective-C asli tersedia di Kelas QSStrings dari Perpustakaan QSUtilities . Saya melakukan patokan cepat: file gambar 5,3MB (JPEG) butuh <50ms untuk menyandikan, dan sekitar 140ms untuk mendekode.
Kode untuk seluruh perpustakaan (termasuk Metode Base64) tersedia di GitHub .
Atau sebagai alternatif, jika Anda ingin kode itu hanya untuk metode Base64 sendiri, saya telah mempostingnya di sini:
Pertama, Anda membutuhkan tabel pemetaan:
Untuk Menyandikan:
Untuk Mendekodekan:
sumber
strResult
dalam encoder tampaknya bocor; hanya membutuhkan afree()
di akhir (sebelum kembali tetapi setelahNSString stringWithCString
)encodeBase64WithData:
metode Anda , bukankah parameter pertama dalam panggilancalloc()
harus ditambah 1 untuk memperhitungkan null terminator ('\0'
) yang Anda tambahkan di akhir?Secara historis kami akan mengarahkan Anda ke salah satu dari banyak pangkalan 64 perpustakaan pihak ketiga (seperti yang dibahas dalam jawaban lain) untuk mengonversi dari data biner ke basis 64 string (dan kembali), tetapi iOS 7 sekarang memiliki pengkodean base 64 asli (dan memperlihatkan metode iOS 4 yang sebelumnya pribadi, jika Anda perlu mendukung versi iOS sebelumnya).
Dengan demikian untuk mengkonversi
NSData
keNSString
basis 64 representasi yang dapat Anda gunakanbase64EncodedStringWithOptions
. Jika Anda juga harus mendukung versi iOS sebelum 7.0, Anda dapat melakukannya:Dan untuk mengonversi basis 64
NSString
kembali keNSData
Anda dapat menggunakaninitWithBase64EncodedString
. Demikian juga, jika Anda perlu mendukung versi iOS sebelum 7.0, Anda dapat melakukan:Jelas, jika Anda tidak perlu kompatibilitas ke belakang dengan versi iOS sebelum 7.0, itu bahkan lebih mudah, cukup gunakan
base64EncodedStringWithOptions
atauinitWithBase64EncodedString
, masing-masing, dan jangan repot-repot dengan pemeriksaan run-time untuk versi iOS sebelumnya. Bahkan, jika Anda menggunakan kode di atas ketika target minimum Anda adalah iOS 7 atau lebih besar, Anda benar-benar akan mendapatkan peringatan kompiler tentang metode yang sudah usang. Jadi, di iOS 7 dan lebih tinggi, Anda cukup mengkonversi ke basis 64 string dengan:dan kembali lagi dengan:
sumber
iOS mencakup dukungan bawaan untuk encoding dan decoding base64. Jika Anda melihat,
resolv.h
Anda harus melihat dua fungsib64_ntop
danb64_pton
. Pustaka SocketRocket Square menyediakan contoh yang masuk akal tentang bagaimana menggunakan fungsi-fungsi ini dari objektif-c.Fungsi-fungsi ini cukup teruji dan andal - tidak seperti banyak implementasi yang Anda temukan dalam posting internet acak. Jangan lupa untuk menghubungkan
libresolv.dylib
.sumber
Karena ini tampaknya menjadi hit nomor satu google pada encoding base64 dan iphone, saya merasa ingin berbagi pengalaman saya dengan potongan kode di atas.
Ini bekerja, tetapi sangat lambat. Patokan pada gambar acak (0,4 mb) membutuhkan 37 detik pada iphone asli. Alasan utama mungkin semua sihir OOP - single NSStrings dll, yang hanya autoreleased setelah pengkodean dilakukan.
Saran lain yang diposting di sini (ab) menggunakan perpustakaan openssl, yang terasa seperti berlebihan juga.
Kode di bawah ini membutuhkan 70 ms - itu adalah 500 kali percepatan. Ini hanya melakukan encoding base64 (decoding akan segera menyusul setelah saya temui)
Saya tidak perlu memotong garis karena saya tidak membutuhkannya, tapi ini sepele untuk ditambahkan.
Bagi mereka yang tertarik untuk mengoptimalkan: tujuannya adalah untuk meminimalkan apa yang terjadi di loop utama. Oleh karena itu semua logika untuk berurusan dengan 3 byte terakhir diperlakukan di luar loop.
Juga, cobalah untuk mengerjakan data di tempat, tanpa menyalin tambahan ke / dari buffer. Dan kurangi aritmatika apa pun seminimal mungkin.
Perhatikan bahwa bit yang disatukan untuk mencari entri di tabel, tidak akan tumpang tindih ketika mereka akan di-orred bersama tanpa bergeser. Perbaikan besar karena itu bisa menggunakan 4 tabel pencarian 256 byte terpisah dan menghilangkan pergeseran, seperti ini:
Tentu saja Anda dapat mengambilnya jauh lebih jauh, tapi itu di luar cakupan di sini.
sumber
Dalam peningkatan mvds yang sangat baik, ada dua masalah. Ubah kode menjadi ini:
sumber
Solusi yang lebih baik:
Ada fungsi bawaan di NSData
sumber
Senang orang menyukainya. Pertandingan akhirnya agak cacat, saya harus mengakui. Selain benar mengatur inp = 0 Anda juga harus meningkatkan ukuran tmpbuf menjadi 3, seperti
atau tinggalkan orring mentah [inp + 2]; jika kita memiliki [inp + 2] mentah! = 0 untuk chunk ini, kita masih berada dalam loop, tentu saja ...
Either way bekerja, Anda mungkin mempertimbangkan menjaga blok tabel pencarian akhir identik dengan yang ada di loop untuk kejelasan. Dalam versi final yang saya gunakan saya lakukan
Untuk menambahkan ==
Maaf saya tidak memeriksa RFC dan yang lainnya, seharusnya melakukan pekerjaan yang lebih baik!
sumber
Di bawah iOS8 dan kemudian menggunakan
- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options
NSDatasumber
sumber
Untuk pembaruan untuk menggunakan
NSData (NSDataBase64Encoding)
metode kategori di iOS7 lihat jawaban saya di sini: https://stackoverflow.com/a/18927627/1602729sumber
Berikut ini adalah versi Objective-C yang ringkas sebagai Kategori di NSData. Butuh beberapa pemikiran tentang ...
Padding dapat ditambahkan jika diperlukan dengan membuat lingkup 'byt' lebih luas dan menambahkan 'dest' dengan (2-byt) "=" karakter sebelum kembali.
Kategori kemudian dapat ditambahkan ke NSString, dengan demikian:
sumber
iOS telah memiliki metode encoding dan decoding Base64 bawaan (tanpa menggunakan libresolv) sejak iOS 4. Namun, itu hanya dideklarasikan di iOS 7 SDK. Dokumentasi Apple menyatakan bahwa Anda dapat menggunakannya saat menargetkan iOS 4 dan di atasnya.
sumber
Berikut ini adalah contoh untuk mengkonversi objek NSData ke Base 64. Itu juga menunjukkan cara untuk pergi ke arah lain (mendekode objek NSData yang disandikan basis 64):
sumber
di iOS 7
sumber
Saya telah melakukannya menggunakan kelas berikut ..
Saat memanggil panggilan
Itu dia...
sumber
Saya pikir ini akan sangat membantu
}
sumber
Unduh Base64
Lakukan kode berikut untuk mengonversi gambar ke base64
sumber
Sesuai kebutuhan Anda, saya telah membuat demo sampel menggunakan Swift 4 di mana Anda dapat menyandikan / mendekode string dan gambar sesuai kebutuhan Anda.
Saya juga menambahkan metode sampel operasi yang relevan.
sumber