如何在swift中有效表示htonl?
How to effectively represent htonl in swift?
我尝试使用socket
传输大文件,后台同意传输方式。 Objective C
可以将 length
正确传递给服务器,但我无法在 Swift
.
上传递正确的 length
我将在下面展示我的两段代码。
Objective 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];
Swift
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: [=11=]) }
// Append message:
sendData.append(msgData)
print(sendData as NSData) // <01000000 03616263>
我尝试使用socket
传输大文件,后台同意传输方式。 Objective C
可以将 length
正确传递给服务器,但我无法在 Swift
.
length
我将在下面展示我的两段代码。
Objective 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];
Swift
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: [=11=]) }
// Append message:
sendData.append(msgData)
print(sendData as NSData) // <01000000 03616263>