Swift ile String – Hex – Byte Array Dönüşümleri

Yaklaşık 4 aydır swift ile ios uygulama geliştirmesi üzerine çalışıyorum. Front-end’den sonra çok istediğim ve bir türlü nasip olmayan mobile development’a geçiş yapmış bulunuyorum.
Bu süre zarfında çalıştığım projeyle alakalı olmak üzere çoğu kez string’lerin manipulasyon ile uğraştım. Aslında c tabanlı kütüphaneleri kullandığınız zaman bu dönüşümlere ihtiyacınız olabilir. Ayrıca bu tip kütüphaneleri kullanırken eğer çok “swifty” çözümler kullanmazsanız memory hatalarıyla karşı karşıya kalacaksınız. Bir de yazdığınız bu çözümleri swift’in extension yapısını kullanmak yapmak mimari yapınızı karmaşadan veya ek bir sınıftan kurtarmış olur.

Herhangi bir string’i hex string’e çevirmek için (bu arada hex’in ne olduğunu anlatmıyorum):

 
 
  1. extension String{
  2. func getHex() -> String {
  3. let temp = NSString(string:self)
  4. var hex = ""
  5. for i in 0..<temp.length{
  6. hex += String(temp.characterAtIndex(i),radix:16)
  7. }
  8. return hex
  9. }
  10. }
  11. "sercan".getHex() //çıktı: "73657263616e"

 

Hex string’i byte-array’e çevirmek için:

 
 
  1. extension String{
  2. func hexToByteArray() -> [UInt8] {
  3. let tempStr = NSString(string: self)
  4. let len = tempStr.length
  5. var arr = [UInt8]()
  6. for i in 0..<len where i%2 == 0{
  7. let x = tempStr.substringWithRange(NSRange(location: i, length: 2))
  8. let y = UInt8.init(x, radix: 16)
  9. arr.append(y!)
  10. }
  11. return arr
  12. }
  13. }
  14. "sercan".getHex().hexToByteArray() //çıktı: [115, 101, 114, 99, 97, 110]

 

Yine de belirtmekte fayda var UInt8 bizim diğer programlama dillerinde kullandığımız byte-array‘in swiftçesi

Bunun haricinde de NSData haline getirdiğimiz byte-array’i [bknz: NSData(bytes: <T,UnsafePointer>, length: <T,Int>)] hex’e çevirme olayımız var:

 
 
  1. extension NSData {
  2. func getHex() -> String? {
  3. var bytes = [UInt8](count: length, repeatedValue: 0)
  4. getBytes(&bytes, length: length)
  5. let hexString = NSMutableString()
  6. for byte in bytes {
  7. hexString.appendFormat("%02x", UInt(byte))
  8. }
  9. return String(hexString)
  10. }
  11. }
  12. var arr = "sercan".getHex().hexToByteArray()
  13. NSData(bytes: arr, length: arr.count).getHex() //çıktı: "73657263616e"

 

Çevirimler mantığı bildikten sonra çok kolay zaten.
Esen kalın