Можно ли безопасно изменить порядок байтов Double? - PullRequest
1 голос
/ 16 мая 2019

Double представляется в памяти с использованием 8 байтов. Я считаю, что эти 8 байтов должны иметь два компонента, по одному для целой части и один для дробной части (поправьте меня, если я ошибаюсь в этом предположении). Моя машина немного порядковая (в настоящее время каждый Macmini). Я хочу перенести эти 8 байтов, представляющих Double, в файл, который должен быть читаем на платформе BigEndian (в частности, JVM, которая является BE).

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

Безопасно ли просто изменять порядок байтов для Double, учитывая, что он имеет два компонента? Если это небезопасно, как мне представить данные LittleEndian в данных BidEndian?

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

1 Ответ

1 голос
/ 16 мая 2019

Существует метод bitPattern для получения битовой комбинации значений с плавающей запятой в виде целого числа и инициализатор Double(bitPattern:) для обратного преобразования.Из документации:

Битовая комбинация соответствует двоичному формату обмена, определенному спецификацией IEEE 754.

Поэтому - при условии, что JVM использует тот же двоичный обмен IEEE 754формат - было бы безопасно следующее:

let x = 12.34

// Double to binary interchange format (big endian):
let data = withUnsafeBytes(of: x.bitPattern.bigEndian) { Data($0) }

И для обратного направления:

// Binary interchange format (big endian) to Double:
let y = data.withUnsafeBytes { Double(bitPattern: UInt64(bigEndian: $0.load(as: UInt64.self))) }
...