【问题标题】:How to effectively represent htonl in swift?如何在swift中有效地表示htonl?
【发布时间】:2019-05-15 14:08:22
【问题描述】:

我尝试使用socket传输大文件,后端同意传输方式。 Objective C 可以将length 正确传递给服务器,但我无法在Swift 上传递正确的length

我将在下面展示我的两段代码。

目标 C

NSMutableData *sendData = [NSMutableData data];
NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding];
uint8_t array[] = {1};
NSData *typeData = [[NSData alloc] initWithBytes:array length:sizeof(array)];
[sendData appendData:typeData];
uint32_t length = htonl(data.length);
NSData *lengthData = [[NSData alloc] initWithBytes:&length length:sizeof(int)];
[sendData appendData:lengthData];
[sendData appendData:data];
self.client.userData = fileId;

[self.client writeData:sendData withTimeout:-1 tag:11];

斯威夫特

let sendData = NSMutableData()
let data = messageField.text!.data(using: .utf8)
let typeData = Data.init(bytes: [1], count: MemoryLayout<Int>.size)
sendData.append(typeData)

let length: UInt32 = 20
var convertedNumber: UInt32 = length.bigEndian
let lengthData = Data.init(bytes: &convertedNumber, count: MemoryLayout<UInt32>.size)
sendData.append(lengthData)
sendData.append(data!)

clientSocket.write(sendData as Data, withTimeout: -1, tag: 0)

Java

byte type = in.readByte();
int length = in.readInt();

Objective C 代码没问题,如何转换成swift

【问题讨论】:

    标签: swift asyncsocket


    【解决方案1】:

    length.bigEndian 将整数转换为其大端表示的正确方法。但是有一个错误

    let typeData = Data.init(bytes: [1], count: MemoryLayout<Int>.size)
    

    创建 8 字节数据(其中大部分未定义)。

    请注意,同样可以更直接地实现,无需使用NSMutableData。这是一个例子:

    let message = "abc"
    let msgData = Data(message.utf8)
    
    var sendData = Data()
    // Append type:
    sendData.append(1)
    // Append message length:
    let length = UInt32(msgData.count).bigEndian
    withUnsafeBytes(of: length) { sendData.append(contentsOf: $0) }
    // Append message:
    sendData.append(msgData)
    
    print(sendData as NSData) // <01000000 03616263>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      相关资源
      最近更新 更多