ios - 如何在 Swift 中将 UnsafeMutablePointer<UInt8> 转换为 UIImage

标签 ios swift sockets uiimage inputstream

我一直在尝试从android发送图像数据并使用Socket在iOS上接收,但问题是我无法显示从流接收的数据中的图像。

这是完整的代码:-

设置网络通信

var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
                                           ip as CFString,
                                           3003,
                                           &readStream,
                                           &writeStream)

        inputStream = readStream!.takeRetainedValue()
        outputStream = writeStream!.takeRetainedValue()
        inputStream.delegate = self
//        outputStream.delegate = self
        inputStream.schedule(in: .current, forMode: RunLoop.Mode.common)
        outputStream.schedule(in: .current, forMode: RunLoop.Mode.common)
        inputStream.open()
        outputStream.open()

通过代表接收数据,如下所示:-

extension ChatRoom: StreamDelegate {
    func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
        switch eventCode {
        case Stream.Event.hasBytesAvailable:
            print("new message received")
            readAvailableBytes(stream: aStream as! InputStream)
        case Stream.Event.endEncountered:
            print("end received")
            stopStreamSession()
        case Stream.Event.errorOccurred:
            print("error occurred")
        case Stream.Event.hasSpaceAvailable:
            print("has space available")
        case Stream.Event.openCompleted:
            print("Stream opened")
        default:
            print("some other event...")
            break
        }
    }
    private func readAvailableBytes(stream: InputStream) {
        let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: maxReadLength)
        while stream.hasBytesAvailable {

            let numberOfBytesRead = inputStream.read(buffer, maxLength: maxReadLength)

            if numberOfBytesRead < 0 {
                if let _ = stream.streamError {
                    break
                }
            }

            NSLog("number of bytes read = %i", numberOfBytesRead)

            if numberOfBytesRead > 0 {
            dataOfImage.append(buffer, count: numberOfBytesRead)

            }
        }

    }

}

我一直在尝试显示使用 UIImage(data:dataOfImage) 收到的数据中的图像,但它显示 nil ,当我检查 dataOfImage 时,它​​包含从流接收的所有数据。

任何人都可以建议一种从 UnsafeMutablePointer<UInt8> 中获取图像的方法吗?数据。

此外,如果有更好的通过套接字传输数据的方法,请提出建议..

最佳答案

而不是分配内存声明一个容量为maxReadLength缓冲区变量

并且 stream(_:handle:) 被调用多次。您必须检查read函数的结果

private var dataOfImage = Data()

private func readAvailableBytes(stream: InputStream) {
    var buffer = [UInt8](repeating: 0, count: maxReadLength)
    let bytesRead = inputStream.read(&buffer, maxLength: maxReadLength)
    switch bytesRead {
    case 0: // success, end of file
    case -1: // error
    default: // append data
       dataOfImage.append(contentsOf: buffer)
    }

    NSLog("number of bytes read = %i", bytesRead)
}

关于ios - 如何在 Swift 中将 UnsafeMutablePointer<UInt8> 转换为 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56444473/

相关文章:

ios - 从自定义 UITableViewCell 更新数据

javascript - Sails.js 0.10 套接字未连接

c# - 客户端上的 10048 套接字错误?可能的原因?

iOS开发-无限层级的uitableview

ios - 使用 UIViewController 快速拉动刷新,无需 TableView 或 TableViewController

swift - 将解析指针值存储在变量中

swift - WatchKit:仅更改一个界面 Controller 标题颜色

c - udp套接字到底接收什么?

ios - 将可选字符串转换为日期

ios - 捕获 UINavigationBar 上的触摸?