2015-12-22 2 views
0

Мне нужно прочитать массив UInt8 и добавить определенные байты в String, но он дает мне ошибку, независимо от того, что я пробовал. += не работает с CChar(ptr[i]) жалуется. String.append() не работает, он ожидает Character, а не CChar, и почему в аду все так конвертируется в Swift, но не CChar в Character? вот мой пример функКак я могу добавить UInt8 (из массива) в строку?

func FromBuf(ptr: UnsafeMutablePointer<UInt8>, length len: Int) -> String { 
    var i: Int = 0 
    while (i < len) { 
    if (i > 0) { s.append(CChar(ptr[i])) } 
    i++ 
    } 
    return s 
} 

Кроме того, что было бы лучшим способом положить а String из части UInt8 массива? Я пробовал это, но он не работает, var s = String(bytes: &ptr[3], encoding: NSASCIIStringEncoding). На самом деле этот инициализатор также не имеет возможности указать, сколько байтов должно получить от указателя.

ответ

1

Вы можете использовать метод Foundation NSString(bytes:length:encoding:) для преобразования из необработанных байтов в строку.

import Foundation 

func FromBuf(ptr: UnsafeMutablePointer<UInt8>, length len: Int) -> String? { 
    // convert the bytes using the UTF8 encoding 
    if let theString = NSString(bytes: ptr, length: len, encoding: NSUTF8StringEncoding) { 
     return theString as String 
    } else { 
     return nil // the bytes aren't valid UTF8 
    } 
} 

Если вы просто хотите, чтобы использовать часть массива байтов, то вы могли бы также поставить начальное смещение функции в качестве дополнительного параметра.

import Foundation 

func FromBuf(ptr: UnsafeMutablePointer<UInt8>, startingOffset: Int, length len: Int) -> String? { 
    // convert the bytes using the UTF8 encoding 
    if let theString = NSString(bytes: ptr + startingOffset, length: len, encoding: NSUTF8StringEncoding) { 
     return theString as String 
    } else { 
     return nil // the bytes aren't valid UTF8 
    } 
} 
+0

Благодаря @Marc, это даже спасло меня от добавления одного символа за один раз –

Смежные вопросы