3

I can't convert this below byte array into String in swift.

let chars: [UInt8] =  [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0]

let datastring = NSString(data: chars, encoding: NSUTF8StringEncoding)

But in android it just works fine I don't know whats wrong in swift.

pkamb
  • 33,281
  • 23
  • 160
  • 191
nik
  • 2,289
  • 6
  • 37
  • 60

3 Answers3

6

[UInt8] is not NSData, so you can't use the NSString(data... initializer

You might use

let chars: [UInt8] =  [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0]
let count = chars.count / sizeof(UInt8)
let datastring = NSString(bytes: chars, length: count, encoding: NSASCIIStringEncoding)

In Swift 3 things have become much easier as a native String can be initialized with a sequence of bytes.

let datastring = String(bytes: chars, encoding: .utf8)

However the example is not meaningful because it doesn’t represent a string so datastring will be nil. Use valid data like

let chars : [UInt8] = [72, 101, 108, 108, 111]
let datastring = String(bytes: chars, encoding: .utf8) // "Hello"
vadian
  • 274,689
  • 30
  • 353
  • 361
4

In Swift 3 you can use this:

import Foundation
let chars: [UInt8] =  [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0]
let string = String(data: Data(chars), encoding: .utf8)
Kacper Dziubek
  • 1,513
  • 1
  • 11
  • 16
0

let str = String(decoding: chars, as: UTF8.self) - changes wrong byts by 0xfffd let str = chars.map { String(UnicodeScalar($0)) }.joined()