Я хочу прочитать содержимое двоичного файла, выполнить двоичный NOT на каждом байте в буфере файлов, а затем записать измененный буфер обратно в другой файл на диске. В настоящее время я использую примерно следующее:Быстрая и надежная техника для изменения байтов буфера в Ruby?
data = nil
::File.open('somefile.bin', 'rb') do | f |
data = f.read(f.stat.size)
end
# unpack can sometimes throw an out of memory exception
raw_bytes = data.unpack('C*')
raw_bytes.map! do | byte |
~byte
end
::File.open('somefile.bin.not', 'wb') do | f |
f.write(raw_bytes.pack('C*'))
end
Это работает, однако распаковка иногда выдает исключение из памяти. Можно ли отредактировать буфер data
напрямую, не прибегая к необходимости распаковывать его в массив (я решил сделать это, чтобы я мог использовать карту! Для изменения байтов).
Поскольку это необходимо выполнить на 100 тысячах файлов (все файлы имеют размер < = 30 МБ). Вышеупомянутое решение работает нормально, но не является надежным из-за проблемы с памятью. Я полагаю, что избегать распаковки и изменения буфера данных напрямую может избежать этого.
Может ли кто-нибудь улучшить мое существующее решение? Огромное спасибо.