gpt4 book ai didi

objective-c - 如何在 Swift 中将 Int32 写入 NSOutputStream

转载 作者:可可西里 更新时间:2023-11-01 01:06:39 26 4
gpt4 key购买 nike

我试图在 Swift 中将 Int32 写入 NSOutputStream,但我遇到了困难。在 ObjC 中,我会做这样的事情:

-(void)write4ByteField:(int32_t)value {
[stream write:((value >> 24) & 0xff)];
[stream write:((value >> 16) & 0xff)];
[stream write:((value >> 8) & 0xff)];
[stream write:(value & 0xff)];
}

但是,在 Swift 中,它真的不喜欢我做所有那些低级的移位,所以我放弃了在所有地方转换值。

我试过类似的方法:

func write4ByteField(value: Int32) {
stream.write(&value, maxLength: sizeof(Int32))
}

但我得到一个错误 int16 is not convertible to @lvalue inout $T4

同样,如果我尝试转到 NSData,我会得到同样的错误:

func write4ByteField(value: Int32) {
let data = NSData(bytes: &value, length: sizeof(Int32)
stream.write(data.bytes, maxLength: sizeof(Int32))
}

有什么建议吗?我猜我只是以错误的方式解决了这个问题。

最佳答案

您最后的方法几乎是正确的。 value 需要是一个变量参数这样你就可以将它用作“in-out 表达式”&value,而 data.bytes 需要一个转换:

func write4ByteField(var value: Int32) {
let data = NSData(bytes: &value, length: sizeof(Int32))
stream.write(UnsafePointer(data.bytes), maxLength: sizeof(Int32))
}

它也可以在没有 NSData 的情况下完成,包括转换为 big-endian字节顺序:

func write4ByteField(value: Int32) {
var valueBE = value.bigEndian
withUnsafePointer(&valueBE) {
self.stream.write(UnsafePointer($0), maxLength: sizeofValue(valueBE))
}
}

关于objective-c - 如何在 Swift 中将 Int32 写入 NSOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26593831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com