在Swift中将字节附加到NSMutableData

时间:2014-10-11 13:05:51

标签: swift

在Obj-C中,我可以成功地附加在两个引号内的字节,如下所示:

[commands appendBytes:"\x1b\x61\x01"
                   length:sizeof("\x1b\x61\x01") - 1]; 

在Swift我想我会做类似的事情:

commands.appendBytes("\x1b\x61\x01", length: sizeof("\x1b\x61\x01") - 1)

但这会引发错误“文字中的无效转义序列”,如何在Swift中转义字节?

2 个答案:

答案 0 :(得分:2)

如前所述,在Swift中,一个字符串存储Unicode字符,而不是 - 在(Objective-)C中 - 一个char的任意(NUL终止)序列,它是一个签名 或大多数平台上的无符号字节。

现在理论上你可以从Swift字符串中检索一个C字符串:

let commands = NSMutableData()
let cmd = "\u{1b}\u{61}\u{01}"
cmd.withCString {
    commands.appendBytes($0, length: 3)
}
println(commands) // <1b6101>

但这不会产生所有非ASCII字符的预期结果:

let commands = NSMutableData()
let cmd = "\u{1b}\u{c4}\u{01}"
cmd.withCString {
    commands.appendBytes($0, length: 3)
}
println(commands) // <1bc384>

此处\u{c4}是“Ä”,其中包含UTF-8表示C3 84

Swift字符串不能表示任意字节序列。 因此,您最好使用UInt8数组来处理(二进制)控制序列:

let commands = NSMutableData()
let cmd : [UInt8] = [ 0x1b, 0x61, 0xc4, 0x01 ]
commands.appendBytes(cmd, length: cmd.count)
println(commands) // <1b61c401>

对于 text ,您必须知道打印机所期望的编码。 例如,NSISOLatin1StringEncodingISO-8859-1编码,适用于“西欧”语言:

let text = "123Ö\n"
if let data = text.dataUsingEncoding(NSISOLatin1StringEncoding) {
    commands.appendData(data)
    println(commands) // 313233d6 0a>
} else {
    println("conversion failed")
}

答案 1 :(得分:1)

Swift中的Unicode字符输入方式不同 - 您需要在十六进制数字周围添加花括号:

"\u{1b}\u{61}\u{01}"

为避免重复文字,请为其定义一个常量:

let toAppend = "\u{1b}\u{61}\u{01}"
commands.appendBytes(toAppend, length: toAppend.length - 1)