【问题标题】:swift create byte buffer holder for NSStream为 NSStream 快速创建字节缓冲区持有者
【发布时间】:2023-03-31 06:35:01
【问题描述】:

Ray Wenderlich tutorial on sockets 中,为了从 Objective-C 中的输入流中读取字节,我们做了

uint8_t buffer[1024];
        int len;

        while ([inputStream hasBytesAvailable]) {
            len = [inputStream read:buffer maxLength:sizeof(buffer)];
            if (len > 0) {

                NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];

                if (nil != output) {
                    NSLog(@"server said: %@", output);
                }

在 Swift 中,我尝试了以下方法,但没有成功

        if (stream == inputStream) {
//            var buffer = Array<UInt8>(count: 1024, repeatedValue: 0)
            var buffer : UnsafeMutablePointer<UInt8>
            var len : Bool

            while (inputStream?.hasBytesAvailable == true) {
                len = inputStream?.getBuffer(buffer, length: sizeofValue(buffer))

                if (len) {
                    var output = String(NSString(bytes: buffer, length: sizeofValue(buffer), encoding: NSASCIIStringEncoding))

                }
            }
        }

【问题讨论】:

  • Swift 代码中没有分配缓冲区。
  • 知道如何读取输入流吗?

标签: swift


【解决方案1】:

您可以使用Array&lt;UInt8&gt; 作为缓冲区并按原样传递documented in Using Swift with Cocoa and Objective-C

let bufferSize = 1024
var buffer = Array<UInt8>(count: bufferSize, repeatedValue: 0)

let bytesRead = inputStream.read(&buffer, maxLength: bufferSize)
if bytesRead >= 0 {
    var output = NSString(bytes: &buffer, length: bytesRead, encoding: NSUTF8StringEncoding)
} else {
    // Handle error
}

-[NSInputStream read:maxLength:] 返回一个数字,表示它读取了多少字节(如果它 >= 0)或是否有错误(如果它是负数)。您应该相应地检查返回值。

【讨论】:

  • 谢谢,今晚我会在家里检查一下,如果它有效,我会将其标记为答案。我正在使用 getBuffer ,它返回一个布尔值。这也可能是问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2015-08-25
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多