簡體   English   中英

如何在swift中有效地表示htonl?

[英]How to effectively represent htonl in swift?

我試圖使用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

length.bigEndian 將整數轉換為big-endian表示的正確方法。 但是有一個錯誤

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM