[英]Can not pass arguments to CFSwapInt16LittleToHost correctly in Swift
[英]How to use CFSwapInt32BigToHost , CFSwapInt16BigToHost effectively in Swift
我正在开发一个应用程序,并尝试将旧的Obj-C代码移植到Swift。 由于它与FileHandling有关,并且我几乎没有处理它的经验,因此我对如何执行它感到困惑。 这就是为什么我需要您的帮助-
这是我坚持的方法。 它所做的是从文档目录读取文件,然后跳偏移指针以读取数据。
我想了解-1.我们何时以及如何在Swift中使用CFSwapInt32BigToHost和CFSwapInt16BigToHost? 2.什么是UnsafeMutablePointer,我们如何用data.bytes初始化它?
- (NSMutableArray *)getTicketFareFrom:(NSString *)fromStation to:(NSString *)toStation{
NSMutableArray *ticketFareArray = [[NSMutableArray alloc] initWithCapacity:0];
NSString *directoryPath = @"TrainData/r/";
NSString* ticketFareFile = @"tf.dat";
NSString* filePath = [[NSBundle mainBundle] pathForResource:ticketFareFile ofType:@"" inDirectory:directoryPath];
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath: filePath];
if (fileHandle == nil)
NSLog(@"Failed to open file");
//Get lenght for station list
NSData* stationListLenData = [fileHandle readDataOfLength: 4];
int stationListLength = CFSwapInt32BigToHost(*(int*)([stationListLenData bytes]));
//Get station list string
[fileHandle seekToFileOffset: 4];
NSData* stationListData = [fileHandle readDataOfLength: stationListLength];
NSString *stationListString = [[NSString alloc] initWithData:stationListData encoding:NSUTF8StringEncoding];
_stationListArray = [[NSMutableArray alloc] initWithArray:[stationListString componentsSeparatedByString:@","] copyItems: YES];
//Get length for via list
[fileHandle seekToFileOffset: 4 + stationListLength];
NSData* viaListLenData = [fileHandle readDataOfLength: 4];
int viaListLength = CFSwapInt32BigToHost(*(int*)([viaListLenData bytes]));
//get via list string
[fileHandle seekToFileOffset: 4 + stationListLength + 4];
NSData* viaListData = [fileHandle readDataOfLength: viaListLength];
NSString *viaListString = [[NSString alloc] initWithData:viaListData encoding:NSUTF8StringEncoding];
_viaRouteArray = [[NSMutableArray alloc] initWithArray:[viaListString componentsSeparatedByString:@","] copyItems: YES];
NSUInteger fromIndex = [_stationListArray indexOfObject:fromStation];
NSUInteger toIndex = [_stationListArray indexOfObject:toStation];
//get length for Ticket fare data
[fileHandle seekToFileOffset: 4 + stationListLength + 4 + viaListLength];
NSData *ticketFareLenData = [fileHandle readDataOfLength: 4];
int faredata_len = CFSwapInt32BigToHost(*(int*)([ticketFareLenData bytes]));
//get ticket fare data
[fileHandle seekToFileOffset: 4 + stationListLength + 4 + viaListLength + 4];
NSData *ticketFareData = [fileHandle readDataOfLength: faredata_len];
[fileHandle closeFile];
for (int i = 0; i<faredata_len; i = i+18) {
unsigned char byte[2];
int offset = 0;
// 1.from(int)
// 2.to(int)
// 3.via index(int)
// 4.II(int)
// 5.II pass monthly(int)
// 6.II_pass_quarterly(int)
// 7.I(int)
// 8.I_pass_monthly(int)
// 9.I_pass_quarterly(int)
[ticketFareData getBytes:&byte range:NSMakeRange(i, 2)];
int from = CFSwapInt16BigToHost(*(int*)(byte));
offset = offset + 2;
[ticketFareData getBytes:&byte range:NSMakeRange(i + offset, 2)];
int to = CFSwapInt16BigToHost(*(int*)(byte));
//add if condition for From an To matching
if (from == fromIndex && to == toIndex) {
MITicketFare *ticketFare = [[MITicketFare alloc] init];
offset = offset + 2;
[ticketFareData getBytes:&byte range:NSMakeRange(i + offset, 2)];
int viaIndex = CFSwapInt16BigToHost(*(int*)(byte));
ticketFare.viaRoute = [_viaRouteArray objectAtIndex:viaIndex];
offset = offset + 2;
[ticketFareData getBytes:&byte range:NSMakeRange(i + offset, 2)];
int secondticketfare = CFSwapInt16BigToHost(*(int*)(byte));
ticketFare.secondticketfare = secondticketfare;
offset = offset + 2;
[ticketFareData getBytes:&byte range:NSMakeRange(i + offset, 2)];
int secondpass1mfare = CFSwapInt16BigToHost(*(int*)(byte));
ticketFare.secondpass1mfare = secondpass1mfare;
offset = offset + 2;
[ticketFareData getBytes:&byte range:NSMakeRange(i + offset, 2)];
int secondpass3mfare = CFSwapInt16BigToHost(*(int*)(byte));
ticketFare.secondpass3mfare = secondpass3mfare;
offset = offset + 2;
[ticketFareData getBytes:&byte range:NSMakeRange(i + offset, 2)];
int firstticketfare = CFSwapInt16BigToHost(*(int*)(byte));
ticketFare.firstticketfare = firstticketfare;
offset = offset + 2;
[ticketFareData getBytes:&byte range:NSMakeRange(i + offset, 2)];
int firstpass1mfare = CFSwapInt16BigToHost(*(int*)(byte));
ticketFare.firstpass1mfare = firstpass1mfare;
offset = offset + 2;
[ticketFareData getBytes:&byte range:NSMakeRange(i + offset, 2)];
int firstpass3mfare = CFSwapInt16BigToHost(*(int*)(byte));
ticketFare.firstpass3mfare = firstpass3mfare;
if (![self isTicketFareDuplicate:ticketFareArray ticketFare:ticketFare]) {
[ticketFareArray addObject:ticketFare];
}
}
}
return ticketFareArray;
}
我尝试移植该方法-
func getTicketFareFrom(fromStation:String, toStation:String)->Array<TicketFareModel>
{
var ticketFareArray:Array<TicketFareModel> = [];
// Read data from File
let directoryPath = "TrainData/r/";
let ticketFareFile = "tf.dat";
let filePath = NSBundle.mainBundle().pathForResource(ticketFareFile, ofType: "" , inDirectory:directoryPath);
let fileHandle = NSFileHandle(forReadingAtPath: filePath!);
if (fileHandle == nil)
{
print("Failed to open file");
}
else if(fileHandle != nil)
{
//Get length for station list
let stationListLenData:NSData = fileHandle!.readDataOfLength(4);
let stationListLength:Int = Int(CFSwapInt32BigToHost((stationListLenData.uint32))); // instead of uint32 it should be .bytes
//Get station list string
fileHandle!.seekToFileOffset(4);
let stationListData = fileHandle!.readDataOfLength(stationListLength);
let stationListString = NSString(data: stationListData, encoding: NSUTF8StringEncoding);
// self.stationListArray = [String](stationListString.componentsSeparatedByString(","), copyItems: true);
self.stationListArray = (stationListString!.componentsSeparatedByString(","));
//Get length for via list
fileHandle!.seekToFileOffset(UInt64(4 + stationListLength));
let viaListLenData:NSData = fileHandle!.readDataOfLength(4);
let viaListLength:Int = Int(CFSwapInt32BigToHost((viaListLenData.uint32)));//CFSwapInt32BigToHost(*(int*)([viaListLenData bytes]));
//get via list string
fileHandle!.seekToFileOffset(UInt64(4 + stationListLength + 4));
let viaListData:NSData = fileHandle!.readDataOfLength(viaListLength);
let viaListString = NSString(data: viaListData, encoding: NSUTF8StringEncoding);
self.viaRouteArray = (viaListString!.componentsSeparatedByString(",")); //[[NSMutableArray alloc] initWithArray:[viaListString componentsSeparatedByString:@","] copyItems: YES];
let fromIndex: Int = self.stationListArray.indexOf(fromStation)!;
let toIndex: Int = stationListArray.indexOf(toStation)!;
//get length for Ticket fare data
fileHandle!.seekToFileOffset(UInt64(4 + stationListLength + 4 + viaListLength));
let ticketFareLenData:NSData = fileHandle!.readDataOfLength(4);
let faredata_len:Int = Int(CFSwapInt32BigToHost((ticketFareLenData.uint32))); //int faredata_len = CFSwapInt32BigToHost(*(int*)([ticketFareLenData bytes]));
//get ticket fare data
fileHandle!.seekToFileOffset(UInt64(4 + stationListLength + 4 + viaListLength + 4));
let ticketFareData:NSData = fileHandle!.readDataOfLength(faredata_len);
fileHandle!.closeFile();
/* */
for (var i:Int = 0; i<faredata_len; i = i+18)
{
var byte: [UInt8];
var offset:Int = 0;
ticketFareData.getBytes(&byte, range: NSMakeRange(i, 2))
var from: Int = Int(CFSwapInt16BigToHost((ticketFareData.uint16)));//CFSwapInt16BigToHost(Int(&byte))
offset = offset + 2
ticketFareData.getBytes(&byte, range: NSMakeRange(i + offset, 2))
var to: Int = CFSwapInt16BigToHost(Int(byte))
if from == fromIndex && to == toIndex
{
var ticketFareModel: TicketFareModel = TicketFareModel()
offset = offset + 2
ticketFareData.getBytes(&byte, range: NSMakeRange(i + offset, 2))
var viaIndex: Int = CFSwapInt16BigToHost(Int(byte))
ticketFareModel.viaRoute = viaRouteArray[viaIndex]
offset = offset + 2
ticketFareData.getBytes(&byte, range: NSMakeRange(i + offset, 2))
var secondticketfare: Int = CFSwapInt16BigToHost(Int(byte))
ticketFareModel.secondticketfare = secondticketfare
offset = offset + 2
ticketFareData.getBytes(&byte, range: NSMakeRange(i + offset, 2))
var secondpass1mfare: Int = CFSwapInt16BigToHost(Int(byte))
ticketFareModel.secondpass1mfare = secondpass1mfare
offset = offset + 2
ticketFareData.getBytes(&byte, range: NSMakeRange(i + offset, 2))
var secondpass3mfare: Int = CFSwapInt16BigToHost(Int(byte))
ticketFareModel.secondpass3mfare = secondpass3mfare
offset = offset + 2
ticketFareData.getBytes(&byte, range: NSMakeRange(i + offset, 2))
var firstticketfare: Int = CFSwapInt16BigToHost(Int(byte))
ticketFareModel.firstticketfare = firstticketfare
offset = offset + 2
ticketFareData.getBytes(&byte, range: NSMakeRange(i + offset, 2))
var firstpass1mfare: Int = CFSwapInt16BigToHost(Int(byte))
ticketFareModel.firstpass1mfare = firstpass1mfare
offset = offset + 2
ticketFareData.getBytes(&byte, range: NSMakeRange(i + offset, 2))
var firstpass3mfare: Int = CFSwapInt16BigToHost(Int(byte))
ticketFareModel.firstpass3mfare = firstpass3mfare
if !self.isTicketFareDuplicate(ticketFareArray, ticketFare: ticketFareModel)
{
ticketFareArray.append(ticketFareModel)
}
}
}
//*/
}
return ticketFareArray;
}
我陷入了for循环,我真的不知道我是否正确地完成了这些工作。 我已经阅读了很多关于stackoverflow的问题和答案,但是没有什么对我的理解有用。
谁能告诉我该怎么做?
谢谢。
我已经完成以下代码,它可能会对您有所帮助。
let p = UnsafeMutablePointer<UInt32>.allocate(capacity: ((self.buffer?.count)! / 4))
let ptr = UnsafeMutableBufferPointer<UInt32>(start: p, count: ((self.buffer?.count)! / 4))
_ = self.buffer?.copyBytes(to: ptr)
let contentLen = CFSwapInt32BigToHost(UInt32(p.pointee))
self.buffer是Data?
宾语。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.