繁体   English   中英

如何在Swift中有效使用CFSwapInt32BigToHost,CFSwapInt16BigToHost

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM