1

次のデータを含むバイナリ ファイル test.data があります。

01 E6 B5 8B E8 AF 95 02

最初のバイトは、たとえばシーケンス番号 01 です。次の 6 バイトは、2 つの 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 の長さが可変であるため、Character に対して読み取るバイト数です。一般的に、私の質問は、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 に答える