Я использую FortranFiles.jl для взаимодействия с файлами, написанными старым кодом Fortran. В одной части данного файла строковые массивы преобразуются в единый массив Float64 (или Float32, в зависимости от) и сохраняются в виде записи Fortran.
Я не могу найти документацию о том, как это сделать в руководстве или в Интернете.
Таким образом, чтобы прочитать информацию, я использую что-то вроде:
fid = FortranFile("myfile.dat")
read(fid, (Float64, 10)) # which actually represents 5x 16-char strings
Как можно преобразовать память из массива с плавающей запятой, ограничение, данное из-за использования FortranFiles.jl и способа хранения файла, в непрерывную часть памяти, которая, как известно Джулии, является символами?
Подумайте о чем-то похожем на превращение (void *)
в C в (double *)
и т. д.
Спасибо.
Редактировать — Исправлен неточный комментарий выше о том, сколько 16-символьных строк считывалось.
Крастанов,
Спасибо. Использование reinterpret
было, по сути, ответом. Однако были выявлены некоторые нюансы. (примечание: это для Юлии 1.1.0)
Имея дело с переинтерпретацией между типами разного размера, вам нужно поместить источник в массив даже для одного элемента.
Например, reinterpret(UInt8, 1.23)
не будет работать. Но reinterpret(UInt8, [1.23])
будет работать. Это не проблема для моего примера, так как read
возвращает массив, но я заметил это, когда играл в REPL.
Кроме того, тип Char
является типом Unicode и обрабатывается как 32-битный тип данных, поэтому я использовал UInt8
выше.
Окончательный ответ выглядит так:
fid = FortranFile("myfile.dat")
tmp = read(fid, (Float64, 10)) # This return an array
chars = [Char(i) for i in reinterpret(UInt8, tmp)]
Попробуйте
reinterpret
из стандартной библиотеки.