[英]Read bytes into a Swift String
我有一个二进制文件test.data,其中包含以下数据:
01 E6 B5 8B E8 AF 95 02
例如,第一个字节只是序列号01。接下来的6个字节是两个UTF8汉字“测试”。然后,第8个字节又是另一个序列号02。
据我所知,UTF8是可变长度(1-4字节)。 请参考这篇文章 。
我正在使用以下代码读取Int32和Byte(UInt8):
extension NSInputStream
{
func readInt32() -> Int
{
var readBuffer = Array<UInt8>(count:sizeof(Int32), repeatedValue: 0)
var numberOfBytesRead = self.read(&readBuffer, maxLength: readBuffer.count)
return Int(readBuffer[0]) << 24 |
Int(readBuffer[1]) << 16 |
Int(readBuffer[2]) << 8 |
Int(readBuffer[3])
}
func readByte() -> Byte {
var readBuffer : Byte = 0
return self.read(&readBuffer, maxLength: sizeof(UInt8))
}
我想编写一个从流中读取字符串的方法。 这是我的想法:
但是问题在于,由于UTF8长度是可变的,因此要读取一个字符多少个字节? 总的来说,我的问题是我应该如何读取UTF8字符串? 提前致谢。
只需读取UnsafeMutablePointer缓冲区并将其转换为String。 返回的字符串将为UTF8。
extension NSInputStream
{
public func readString(length:Int) -> String {
var str = ""
if length > 0 {
var readBuffer = UnsafeMutablePointer<UInt8>.alloc(length+1)
var numberOfBytesRead = self.read(readBuffer, maxLength: length)
if numberOfBytesRead == length {
var buf = UnsafeMutablePointer<CChar>(readBuffer)
buf[length] = 0
// the C String must be null terminated
if let utf8String = String.fromCString(buf) {
str = utf8String
}
}
readBuffer.dealloc(length)
}
return str
}
}
这是我在bagusflyer的评论中提到的固定版本:
extension NSInputStream
{
public func readString(length:Int) -> String {
var str = ""
if length > 0 {
var readBuffer = UnsafeMutablePointer<UInt8>.alloc(length+1)
var numberOfBytesRead = self.read(readBuffer, maxLength: length)
// modified this from == length to > 0
if numberOfBytesRead > 0 {
var buf = UnsafeMutablePointer<CChar>(readBuffer)
buf[numberOfBytesRead] = 0
// the C String must be null terminated
if let utf8String = String.fromCString(buf) {
str = utf8String
}
}
readBuffer.dealloc(length+1)
}
return str
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.