Как преобразовать Int в байтовый массив из 4 байтов в Swift? - PullRequest
1 голос
/ 10 июля 2019

Я использую Swift и пытаюсь преобразовать Int (например, -1333) в байтовый массив из 4 байтов. Мне удалось преобразовать Int в массив из 8 байтов (-1333 становится [255, 255, 255, 255, 255, 255, 250, 203]), но мне нужно, чтобы он был 4 байта. Я знаю, что есть способы сделать это на других языках, таких как Java, но есть ли способ для Swift? Вот мой код: (Я использовал ЭТОТ ответ)

func createByteArray(originalValue: Int)->[UInt8]{
        var result:[UInt8]=Array()

            var _number:Int = originalValue

            let mask_8Bit=0xFF

            var c=0
            var size: Int = MemoryLayout.size(ofValue: originalValue)
            for i in (0..<size).reversed(){
                //at: 0 -> insert at the beginning of the array
                result.insert(UInt8( _number&mask_8Bit),at:0)
                _number >>= 8 //shift 8 times from left to right
            }

        return result
    }

1 Ответ

1 голос
/ 10 июля 2019

В Java целое число всегда 32-разрядное, но в Swift оно может быть 32-разрядным или 64-разрядным, в зависимости от платформы. Ваш код создает массив байтов того же размера, что и тип Int, на 64-битной платформе размером 8 байтов.

Если вы хотите ограничить преобразование 32-разрядными целыми числами, тогда используйте Int32 вместо Int, тогда результатом будет массив из 4 байтов, независимый от платформы.

Альтернативный метод преобразования:

let value: Int32 = -1333
let array = withUnsafeBytes(of: value.bigEndian) { Array($0) }
print(array) // [255, 255, 250, 203]

Или как универсальная функция для целочисленного типа всех размеров:

func byteArray<T>(from value: T) -> [UInt8] where T: FixedWidthInteger {
    return withUnsafeBytes(of: value.bigEndian) { Array($0) }
}

Пример:

print(byteArray(from: -1333))        // [255, 255, 255, 255, 255, 255, 250, 203]
print(byteArray(from: Int32(-1333))) // [255, 255, 250, 203]
print(byteArray(from: Int16(-1333))) // [250, 203]
...