Что эквивалентно Java ByteBuffer в Swift или Objective C? - PullRequest
0 голосов
/ 11 сентября 2018

Мне нужно создать некоторые случайные данные таким же образом в Java.Например, следующий фрагмент.

ByteBuffer bb = ByteBuffer.allocate(16); bb.putDouble(0, Math.random()); bb.putDouble(8, Math.random()); String input = Hex.encodeHexString(bb.array());

Как сделать то же самое в iOS (Swift или Objective-C) и Что эквивалентно ByteBuffer в iOS?

1 Ответ

0 голосов
/ 11 сентября 2018

Я считаю, что объект, который вы ищете, - Data.Это объект, который может представлять любые данные и содержит необработанный байтовый буфер.

Для вашего конкретного случая вам необходимо преобразовать массив двойных значений в данные, которые можно сделать так:

let data: Data = doubleArray.withUnsafeBufferPointer { Data(buffer: $0) }

Теперь, чтобы получить шестнадцатеричную строку из Data, я предлагаю вам указать какой-то другой пост .

Добавив этот код ответа, вы сможете создать свою шестнадцатеричную строку, выполнив

let hexString = data.hexEncodedString()

Итак, чтобы сложить все вместе, вы должны сделать:

extension Data {
    struct HexEncodingOptions: OptionSet {
        let rawValue: Int
        static let upperCase = HexEncodingOptions(rawValue: 1 << 0)
    }

    func hexEncodedString(options: HexEncodingOptions = []) -> String {
        let format = options.contains(.upperCase) ? "%02hhX" : "%02hhx"
        return map { String(format: format, $0) }.joined()
    }
}

func generateRandomDoubleBufferHexString(count: Int, randomParameters: (min: Double, max: Double, percision: Int) = (0.0, 1.0, 100000)) -> String {

    func generateRandomDouble(min: Double = 0.0, max: Double = 1.0, percision: Int = 100000) -> Double {
        let scale: Double = Double(Int(arc4random())%percision)/Double(percision)
        return min + (max-min)*scale
    }

    var doubleArray: [Double] = [Double]() // Create empty array
    // Fill array with random values
    for _ in 0..<count {
        doubleArray.append(generateRandomDouble(min: randomParameters.min, max: randomParameters.max, percision: randomParameters.percision))
    }

    // Convert to data:
    let data: Data = doubleArray.withUnsafeBufferPointer { Data(buffer: $0) }

    // Convert to hex string
    return data.hexEncodedString()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...