1

我有一个包含以下数据的二进制文件 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 字符串?提前致谢。

4

2 回答 2

4

只需读取 UnsafeMutablePointer 缓冲区并将其转换为字符串。返回的字符串将是 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

    }
}
于 2014-09-15T04:09:12.060 回答
4

这是我在对 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

  }
}
于 2015-03-11T13:40:05.017 回答