2016-11-15 215 views
0

我是新來的Swift,我想將一個字符串轉換爲十六進制字符串。我發現一個Objective-C函數把一個字符串轉換成十六進制。Swift3將字符串值轉換爲十六進制字符串

NSString * str = @"Say Hello to My Little Friend"; 

NSString * hexString = [NSString stringWithFormat:@"%@", 
[NSData dataWithBytes:[str cStringUsingEncoding:NSUTF8StringEncoding] 
             length:strlen([str cStringUsingEncoding:NSUTF8StringEncoding])]]; 

for (NSString * toRemove in [NSArray arrayWithObjects:@"<", @">", @" ", nil]) 
    hexString = [hexString stringByReplacingOccurrencesOfString:toRemove withString:@""]; 

NSLog(@"hexStr:%@", hexString); 

現在我不能給這個函數轉換斯威夫特。目前我正在使用Swift3。

請有人能爲我做這個?

+0

使用'if strData = str.data(using:.utf8){/ * ... * /}'構造一個'Data'實例,然後在[this answer]中使用'Data'擴展(http://stackoverflow.com/a/40089462/4573247)獲取以十六進制編碼的字符串('let hexStr = strData.hexEncodedString()')表示的數據。 – dfri

回答

2

這將產生輸出作爲ObjC版本

let str = "Say Hello to My Little Friend" 
let data = str.data(using: .utf8)! 
let hexString = data.map{ String(format:"%02x", $0) }.joined() 
+0

我已經看到'str.data(使用:.utf8)'的顯式展開('!')'也可用於'String' - >'Data'轉換的其他答案。我們知道'data(..)'方法永遠不會失敗嗎? – dfri

+0

@dfri我們知道*向我的小朋友問好*永遠不會失敗。 – vadian

+0

對於所有非空字符串實例,這通常是正確的,還是您碰巧知道哪種字符串可能會失敗? – dfri

0

像這樣將字符串轉換爲NSData。

let myString = "ABCDEF" 
let data = myString.dataUsingEncoding(NSUTF8StringEncoding) 

然後用下面的方法NSData的轉換爲十六進制字符串 -

func hexFromData(data:NSData) -> String { 
    let p = UnsafePointer<UInt8>(data.bytes) 
    let len = data.length 
    var str: String = String() 
    for i in 0...len-1 { 
     str += String(format: "%02.2X", p[i]) 
    } 
    return str 
} 

希望這有助於。

+0

'NSData'已過時Swift 3 – vadian

0

請試試這個,

let string = "Say Hello to My Little Friend" 
let data = string.dataUsingEncoding(NSUTF8StringEncoding) 
print(data) 

,其輸出是:

Optional(<53617920 48656c6c 6f20746f 204d7920 4c697474 6c652046 7269656e 64>) 
0

同斯威夫特3

let string = "Hello World!" 
let data = string.data(using: String.Encoding.utf8) 

let hexString = data?.hex 


extension Data { 

var hex: String { 
     var string = "" 

     #if swift(>=3.1) 
      enumerateBytes { pointer, index, _ in 
       for i in index..<pointer.count { 
        string += String(format: "%02x", pointer[i]) 
       } 
      } 
     #else 
      enumerateBytes { pointer, count, _ in 
       for i in 0..<count { 
        string += String(format: "%02x", pointer[i]) 
       } 
      } 
     #endif 

     return string 
    } 


} 
+0

您能否包含一些細節? – jhhoff02

相關問題