Как мне преобразовать ByteString в Word соответствующего размера? - PullRequest
1 голос
/ 20 сентября 2011

В основном я прочитал 5 байтов, которые соответствуют количеству, но я хотел бы преобразовать его в Word64.Какой лучший способ сделать это?

Редактировать: я должен также сказать, что это выполняется во внутреннем цикле, поэтому производительность имеет решающее значение.В идеале я хотел бы сделать что-то вроде:

uint64_t word = 0;
char bytes[5] = getbytes(5)
word += (bytes[0] << 32) 
        + (bytes[1] << 24) 
        + (bytes[2] << 16) 
        + (bytes[3] << 8) 
        + (bytes[4])

или что-то подобное.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Если вы просто хотите простую функцию, предполагающую порядок байтов с прямым порядком байтов, эта должна выполнить эту работу:

foo :: B.ByteString -> Word64
foo = B.foldl' (\x y -> x * 256 + fromIntegral y) 0

Однако, если вы читаете много двоичных данных, вы можете посмотретьв использование пакета binary .

0 голосов
/ 21 сентября 2011

Как сказал Хаммар, двоичный файл (и строгая версия с тестируемой строкой - зерновой) - это здорово, но они заметно медленнее, чем самые быстрые решения (они выполняют то же смещение, что и в предложении Хаммара).

Я имеюобнаружил, что простая подпрограмма FFI является самым быстрым решением:

getNthWord n b = inlinePerformIO (unsafeUseAsCString b (flip peekElemOff n . castPtr))

Если вы хотите добавить build-dep, столь же быстрое решение - использовать Vector.Storable из векторного пакета.

Обратите внимание, что ни один из них не обрабатывает ваш 5-байтовый формат с прямым порядком байтов, поэтому вам необходимо изменить источник данных, чтобы это было полезно.

PS Решение FFI предполагает выравнивание слов.Первоначально у меня была ошибка, когда пользователи запускали эту процедуру в системах, отличных от x86.

...