我正在尝试将我在JAVA中创建的以下逻辑重新创建为swift:
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}
}
我正在尝试获取一个字符串(消息),该字符串已被传递给上述函数的密钥进行了xor'ed。但是我在swift中的代码没有工作,因为它返回字符数组并且我想要一个字符串,如果我尝试将字符数组转换为字符串,它不会在字符串中显示unicode,如\ u {0001}等... < / p>
假设我得到以下输出:
["_", "W", "^", "9", "\u{14}", "\t", "H"]
然后我尝试转换为字符串,我明白了:
_W ^ 9 H
我想:
_W ^ 9 \∪{14} \ TH
请帮忙。
答案 0 :(得分:1)
有不同的问题。首先,如果你打算打印
&#34;不可打印&#34;字符串\u{}
中的字符转义然后您可以使用
.debugDescription
方法。例如:
let s = "a\u{04}\u{08}b"
print(s) // ab
print(s.debugDescription) // "a\u{04}\u{08}b"
接下来,您的Swift代码将字符串转换为UTF-8,xor是字节 然后将结果转换回String。这很容易失败 如果xor的字节序列无效UTF-8。
Java代码在UTF-16代码单元上运行,因此等效的Swift 代码将是
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
问题是xor&#39;产生无效的UTF-16序列 (一个不平衡的代理对),然后被替换 &#34;替换字符&#34; U + FFFD。
我不知道Java如何处理这个问题,但Swift字符串不能无效
Unicode标量值,因此唯一的解决方案是表示
结果为[UInt16]
数组而不是String
。