У меня есть массив UInt32, как наиболее эффективно записать его в двоичный файл на языке Crystal?
К настоящему времени я использую метод IO#write_byte(byte : UInt8)
, но я считаю, что должен быть способ писать большие куски, чем на 1 байт.
У меня есть массив UInt32, как наиболее эффективно записать его в двоичный файл на языке Crystal?
К настоящему времени я использую метод IO#write_byte(byte : UInt8)
, но я считаю, что должен быть способ писать большие куски, чем на 1 байт.
Вы можете напрямую записать Slice(UInt8)
в любой ввод-вывод, что должно быть быстрее, чем повторение каждого элемента и запись каждого байта один за другим.
Хитрость заключается в том, чтобы получить доступ к внутреннему буферу Array(UInt32)
как Pointer(UInt8)
, а затем сделать его Slice(UInt8)
, что может быть достигнуто с помощью некоторого небезопасного кода:
array = [1_u32, 2_u32, 3_u32, 4_u32]
File.open("out.bin", "w") do |f|
ptr = (array.to_unsafe as UInt8*)
f.write ptr.to_slice(array.size * sizeof(UInt32))
end
Никогда не сохраняйте ссылку на ptr
, см. Array#to_unsafe для получения подробной информации.