繁体   English   中英

将字节读入Swift字符串

[英]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))
    }

我想编写一个从流中读取字符串的方法。 这是我的想法:

  • 读取字节(假设我知道要读取多少个字节)
  • 将字节转换为Character
  • 将字符追加到字符串中

但是问题在于,由于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM