Разбор массива целых без знака в Julia 1.x.x - PullRequest
3 голосов
/ 21 марта 2019

Я пытаюсь открыть бинарный файл, который мне немного знаком с его внутренней структурой, и правильно интерпретировать его в Джулии.Допустим, я могу загрузить его уже через:

arx=open("../axonbinaryfile.abf", "r")  
databin=read(arx)  
close(arx)

Данные загружаются в виде массива UInt8, который, я думаю, является байтом.В первых 4 я могу выполнить простое преобразование Char, и оно работает:

head=databin[1:4]
map(Char, head)

4-element Array{Char,1}:
 'A'
 'B'
 'F'
 ' '

Тогда получается, что в позициях 13-16 находится целое число из 32 байтов, ожидающее интерпретации.Как мне это сделать?Я пробовал reinterpret() и Int32 как функцию, но безрезультатно.

Ответы [ 2 ]

3 голосов
/ 21 марта 2019

Вы можете использовать reinterpret(Int32, databin[13:16])[1]. Последний [1] необходим, потому что reinterpret возвращает вам представление.

Теперь обратите внимание, что read поддерживает передачу типов. Так что если вы сначала прочитали 12 байтов данных из вашего файла, например, как это read(arx, 12) и затем запустите read(arx, Int32), вы получите желаемое число без каких-либо преобразований или распределения векторов.

Наконец, обратите внимание, что преобразование в Char в вашем коде заключается в преобразовании числа Unicode в символ. Я не уверен, что это именно то, что вы хотите (может быть, это так). Например, если первый прочитанный байт имеет значение 200, вы получите:

julia> Char(200)
'È': Unicode U+00c8 (category Lu: Letter, uppercase)

РЕДАКТИРОВАТЬ еще один комментарий заключается в том, что когда вы выполняете преобразование в Int32 из 4 байтов, вы должны обязательно проверить, должно ли оно быть закодировано как big-endian или little-endian (см. * 1019). * постоянные и ntoh, hton, ltoh, htol функции)

2 голосов
/ 21 марта 2019

Вот оно. Используйте view, чтобы избежать копирования данных.

julia> dat = UInt8[65,66,67,68,0,0,2,40];

julia> Char.(view(dat,1:4))
4-element Array{Char,1}:
 'A'
 'B'
 'C'
 'D'

julia> reinterpret(Int32, view(dat,5:8))
1-element reinterpret(Int32, view(::Array{UInt8,1}, 5:8)):
 671219712
...