如何在 swift 中将 \0 打印到标准输出
how to print \0 to stdout in swift
我正在为 chrome 编写本机消息传递扩展,根据协议,我需要输出前 4 个字节作为后续数据的长度。
如果我在 Objective C 中这样做,它会起作用:
int main(int argc, const char * argv[]) {
@autoreleasepool {
char data[] = "{\"payload\":\"19\"}";
int len = strlen(data);
printf("%c%c%c%c",
(char)((len>>0) & 0xff),
(char)((len>>8) & 0xff),
(char)((len>>16) & 0xff),
(char)((len>>24) & 0xff));
printf("%s", data);
}
return 0;
}
我能将它翻译成 Swift 的最佳翻译如下:
import Foundation
var data:String
data = "{\"payload\": \"100\"}"
var length:Int
length = data.characters.count
print(String(format: "%c", (UInt8)((length >> 0) & 0xff)), terminator:"")
print(String(format: "%c", (UInt8)((length >> 8) & 0xff)), terminator:"")
print(String(format: "%c", (UInt8)((length >> 16) & 0xff)), terminator:"")
print(String(format: "%c", (UInt8)((length >> 24) & 0xff)), terminator:"")
print(data, terminator:"")
fflush(__stdoutp)
这表明 chrome 日志中存在错误:
[458:33283:0524/103231:ERROR:native_message_process_host.cc(292)]
Native Messaging host tried sending a message that is 1881307922 bytes long.
发生的事情是打印第一个字节,但其余三个字节的值为零,因此转换为 NUL 字符,这显然是字符串字符的结尾,因此没有打印任何内容。如果我更改数据的前三个字母 ({"p
),那么该数字 1881307922
也会更改,这证实了为确定消息长度而读取的前四个字节是这些,而这三个未打印 NUL 字节。
我想要一个与我现在正在做的事情偏差很小的解决方案。应用程序中还有很多其他的东西我没有展示,如果你提出一个非常不同的解决方案那么这意味着我将不得不重写很多其他代码。
将String(format:
部分替换为Character(UnicodeScalar(
,像这样:
import Foundation
var data:String
data = "{\"payload\": \"100\"}"
var length:Int
length = data.characters.count
print(Character(UnicodeScalar((UInt8)((length >> 0) & 0xff))), terminator:"")
print(Character(UnicodeScalar((UInt8)((length >> 8) & 0xff))), terminator:"")
print(Character(UnicodeScalar((UInt8)((length >> 16) & 0xff))), terminator:"")
print(Character(UnicodeScalar((UInt8)((length >> 24) & 0xff))), terminator:"")
print(data, terminator:"")
fflush(__stdoutp)
我正在为 chrome 编写本机消息传递扩展,根据协议,我需要输出前 4 个字节作为后续数据的长度。
如果我在 Objective C 中这样做,它会起作用:
int main(int argc, const char * argv[]) {
@autoreleasepool {
char data[] = "{\"payload\":\"19\"}";
int len = strlen(data);
printf("%c%c%c%c",
(char)((len>>0) & 0xff),
(char)((len>>8) & 0xff),
(char)((len>>16) & 0xff),
(char)((len>>24) & 0xff));
printf("%s", data);
}
return 0;
}
我能将它翻译成 Swift 的最佳翻译如下:
import Foundation
var data:String
data = "{\"payload\": \"100\"}"
var length:Int
length = data.characters.count
print(String(format: "%c", (UInt8)((length >> 0) & 0xff)), terminator:"")
print(String(format: "%c", (UInt8)((length >> 8) & 0xff)), terminator:"")
print(String(format: "%c", (UInt8)((length >> 16) & 0xff)), terminator:"")
print(String(format: "%c", (UInt8)((length >> 24) & 0xff)), terminator:"")
print(data, terminator:"")
fflush(__stdoutp)
这表明 chrome 日志中存在错误:
[458:33283:0524/103231:ERROR:native_message_process_host.cc(292)]
Native Messaging host tried sending a message that is 1881307922 bytes long.
发生的事情是打印第一个字节,但其余三个字节的值为零,因此转换为 NUL 字符,这显然是字符串字符的结尾,因此没有打印任何内容。如果我更改数据的前三个字母 ({"p
),那么该数字 1881307922
也会更改,这证实了为确定消息长度而读取的前四个字节是这些,而这三个未打印 NUL 字节。
我想要一个与我现在正在做的事情偏差很小的解决方案。应用程序中还有很多其他的东西我没有展示,如果你提出一个非常不同的解决方案那么这意味着我将不得不重写很多其他代码。
将String(format:
部分替换为Character(UnicodeScalar(
,像这样:
import Foundation
var data:String
data = "{\"payload\": \"100\"}"
var length:Int
length = data.characters.count
print(Character(UnicodeScalar((UInt8)((length >> 0) & 0xff))), terminator:"")
print(Character(UnicodeScalar((UInt8)((length >> 8) & 0xff))), terminator:"")
print(Character(UnicodeScalar((UInt8)((length >> 16) & 0xff))), terminator:"")
print(Character(UnicodeScalar((UInt8)((length >> 24) & 0xff))), terminator:"")
print(data, terminator:"")
fflush(__stdoutp)