2017-06-22 61 views
1

我試圖重新以下邏輯我在JAVA中創建快捷:XOR A字符串,它是UINT16或UINT32

public String xorMessage(String message, String key) { 

    try { 
     if (message == null || key == null) return null; 

     char[] keys = key.toCharArray(); 
     char[] mesg = message.toCharArray(); 

     int ml = mesg.length; 
     int kl = keys.length; 
     char[] newmsg = new char[ml]; 

     for (int i = 0; i < ml; i++) { 
      newmsg[i] = (char)(mesg[i]^keys[i % kl]); 
     }//for i 

     return new String(newmsg); 
    } catch (Exception e) { 
     return null; 
    } 

我已經達到了到這裏,而編碼swift3:

import UIKit 
import Foundation 


let t = "22-Jun-2017 12:30 pm" 
let m = "message" 
print(UInt8(t)) 


let a :[UInt8] = Array(t.utf8) 
let v = m.characters.map{String ($0) } 
print(v) 
func encodeWithXorByte(key: UInt8 , Input : String) -> String { 
    return String(bytes: Input.utf8.map{$0^key}, encoding: String.Encoding.utf8) ?? "" 

} 

var ml :Int = Int(m.characters.count) 


var kl :Int = Int (t.characters.count) 



var f = [String]() 
for i in 0..<ml{ 

    let key = a[i%kl] 
    let input = v[i] 


    f.append(String(bytes: input.utf8.map{$0^key} , encoding : String.Encoding.utf8)!) 


    // f.append(<#T##newElement: Character##Character#>) 
    //m[i] = input.utf8.map{$0^key} 

} 

我試圖獲得一個字符串(消息),這個字符串已經被傳遞給上述函數的鍵所異或。但我在swift中的代碼不工作,因爲它正在返回字符數組,並且我想要一個字符串,如果我嘗試將字符數組轉換爲字符串,它不會在字符串中顯示像\ u {0001}等unicode ...

假設我得到以下的輸出:

["_", "W", "^", "9", "\u{14}", "\t", "H"] 

,然後我嘗試轉換爲字符串,我得到這個:

_W^9^h

我想:

_W^9 \ u {14} \ tH

請幫忙。

回答

1

存在不同的問題。首先,如果您打算在字符串\u{}中打印 「不可打印」字符,則可以使用 .debugDescription方法。例如:

let s = "a\u{04}\u{08}b" 
print(s) // ab 
print(s.debugDescription) // "a\u{04}\u{08}b" 

接下來,您的銀行代碼字符串轉換爲UTF-8,異或字節 ,然後將結果轉換回字符串。如果異或字節序列不是有效的UTF-8,則很容易失敗 。

的Java代碼運行在UTF-16代碼單元,所以相當於雨燕 代碼將是

func xorMessage(message: String, key: String) -> String { 
    let keyChars = Array(key.utf16) 
    let keyLen = keyChars.count 

    let newMsg = message.utf16.enumerated().map { $1^keyChars[$0 % keyLen] } 
    return String(utf16CodeUnits: newMsg, count: newMsg.count) 
} 

例子:

let t = "22-Jun-2017 12:30 pm" 
let m = "message" 
let encrypted = xorMessage(message: m, key: t) 
print(encrypted.debugDescription) // "_W^9\u{14}\tH" 

最後,甚至可以產生意想不到的結果,除非你限制 輸入(鍵和消息)爲ASCII字符。例如:

let m = "" 
print(Array(m.utf16).map { String($0, radix: 16)}) // ["d83d", "de00"] 

let t = "a€" 
print(Array(t.utf16).map { String($0, radix: 16)}) // ["61", "20ac"] 

let e = xorMessage(message: m, key: t) 
print(Array(e.utf16).map { String($0, radix: 16)}) // ["fffd", "feac"] 

let d = xorMessage(message: e, key: t) 
print(Array(d.utf16).map { String($0, radix: 16)}) // ["ff9c", "fffd"] 

print(d) // ワ� 
print(d == m) // false 

的問題是,所述異或運算產生一無效的UTF-16序列 (不平衡代理對),其隨後由 「替換字符」 U + FFFD取代。

我不知道的Java如何處理這一點,但斯威夫特字符串不能無效 Unicode標值,所以唯一的解決辦法是代表 結果爲[UInt16]數組,而不是String

+0

謝謝@Martin R這解決了我的問題。 –

相關問題