Не удалось преобразовать код объективного c в swift 4 - PullRequest
0 голосов
/ 16 мая 2018

Может кто-нибудь помочь мне преобразовать эту функцию target-c в swift4?Я пробовал Swiftify, но он дает неправильный вывод.Также я попытался с преобразованием строки в данные, но вывод неправильный.

- (NSData *)stringToData{
if (!HCKBluetoothValidStr(self)) {
    return nil;
}
if (!(self.length % 2 == 0)) {
    return nil;
}
Byte bytes[255] = {0};
NSInteger count = 0;
for (int i =0; i < self.length; i+=2) {

    NSString *strByte = [self substringWithRange:NSMakeRange(i,2)];
    NSLog(@"strbyte is: %@ \n\n",strByte);
    unsigned long red = strtoul([strByte UTF8String],0,16);
    Byte b =  (Byte) ((0xff & red) );//( Byte) 0xff&iByte;
    bytes[i/2+0] = b;
    count ++;
}
NSData * data = [NSData dataWithBytes:bytes length:count];
return data;

}

для той же функции входная строка:

NSString *commandStr = @"1702030a0a";

и вывод из функциив формате NSData:

<1702030a 0a>

РЕДАКТИРОВАТЬ 1:

Я пытался преобразовать его в swift, но strString.utf8CString выдавал ошибку как «Невозможно преобразовать значение типа« ContiguousArray »(иначе'ContiguousArray') к ожидаемому типу аргумента 'UnsafePointer!' "

func stringToData(stringVal: NSString) -> NSData {
    var bytes: [UInt8] = [0]
    var count: Int = 0
    var i = 0
    for index in stride(from: 0, to: stringVal.length , by: 2) {
        var strByte: NSString = stringVal.substring(with: NSMakeRange(index, 2)) as NSString
        print("strbyte is: \(strByte) \n\n")
        let strString = String(strByte)
        print(strString)
        var red: UInt8 = strtoul(strString.utf8CString, 0, 16)


        let b = UInt8((0xff & red))
        count = count+1
    }
    var data = NSData(bytes: bytes, length: count)
    return data
}

1 Ответ

0 голосов
/ 16 мая 2018

Может кто-нибудь помочь мне преобразовать эту функцию target-c в swift4?

Ваша функция принимает строку символов, представляющих шестнадцатеричные цифры, и преобразует каждую пару, если символы - две шестнадцатеричные цифры, каждая из которых представляет 4 двоичных разряда, - и выдает представленное значение байта, которое составляет 8 двоичных разрядов.

Игнорировать все в Objective-C, кроме вызова HCKBluetoothValidStr, который предположительно проверяет правильность введенной строки И на который вы все равно захотите позвонить, и напишите свой собственный код Swift для преобразования String в Data. Вам необходимо сопоставить каждый шестнадцатеричный символ с целым числом, которое он представляет; то есть "3" до 3, "c" до 12 и т.д .; и объединить их в пары; например что-то вроде byteValue = firstDigitValue * 16 + secondDigitValue.

Если вы застряли, задайте новый вопрос, покажите свой код Swift, и кто-то, несомненно, поможет вам оттуда.

...