gpt4 book ai didi

iphone - GameKit 蓝牙传输问题

转载 作者:行者123 更新时间:2023-12-03 16:16:04 25 4
gpt4 key购买 nike

我正在尝试使用 GameKit 框架通过蓝牙发送文件。我遇到的问题是我一次只能发送一个 NSData 对象,但我需要将其保存在另一端。如果不知道文件名,这显然是不可能的,但我不知道如何传输它。我尝试将其转换为字符串 NSData*data = [NSData dataWithContentsOfFile:urlAddress]; 但我只能发送一个 NSData 对象,而不是两个。

有人遇到过这个问题吗?

最佳答案

使用 GameKit 一段时间后,我发现每次“发送”的限制约为 90k,因此如果您的文件大于 90k,则必须将其分解。我建议你如何分解:

第一 - 发送文件名

NSData* fileNameData = [fileNameStr dataUsingEncoding: NSASCIIStringEncoding];
// send 'fileNameData'

第二 - 发送您要发送的 block 数

NSUInteger fiftyK = 51200;
NSUInteger chunkCount = (((NSUInteger)(srcData.length / fiftyK)) + ((srcData.length % fiftyK) == 0 ) ? 0 : 1))
NSString chunkCountStr = [NSString stringWithFormat:@"%d",chunkCount];
NSData* chunkCountData = [chunkCountStr dataUsingEncoding: NSASCIIStringEncoding];
// send 'chunkCountData'

第三步 - 将你的 NSData 对象分解并发送到一组小于 50k 的 NSObject(只是为了保持安全大小)

NSData *dataToSend;
NSRange range = {0, 0};
for(NSUInteger i=0;i<srcData.length;i+=fiftyK){
range = {i,fiftyK};
dataToSend = [srcData subdataWithRange:range];
//send 'dataToSend'
}
NSUInteger remainder = (srcData.length % fiftyK);
if (remainder != 0){
range = {srcData.length - remainder,remainder};
dataToSend = [srcData subdataWithRange:range];
//send 'dataToSend'
}

在接收方,您需要执行以下操作:

第一个 - 接收文件名

// Receive data
NSString* fileNameStr = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding]

第二 - 接收您将要接收的 block 数量

// Receive data
NSString* chunkCountStr = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding]
NSUInteger chunkCount = [chunkCount intValue];

第三 - 接收数据 block

NSMutableData data = [[NSMutableData alloc]init];
for (NSUInteger i=0; i<chunkCount;i++){
// Receive data
[data appendData:receivedData];
}

如果一切正常,您现在将拥有一个包含文件名的 fileNameStr 对象和一个包含文件内容的 data 对象。

希望这有帮助 - AYAL

关于iphone - GameKit 蓝牙传输问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2877523/

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