Вопросы с тегами [bytestring]

1

голосов
1

ответ
129

Просмотры

Преобразование между INT массива или кортежа против байтов правильно

Привет У меня есть эти коды для преобразования между Int массивов и байт типа переменных: BYTES_INTARRAY четкости (х): data_ints = struct.unpack (»
henry783333
1

голосов
1

ответ
327

Просмотры

Натяжение достоверных данных из байтовой строки в Python 3

Учитывая следующую байтовую строку, как я могу удалить любые символы, соответствующие \ XFF и создать объект списка из того, что осталось (расщепление на удаленных районах)? б "\ X07 \ x00 \ x00 \ x00 ~ \ x10 \ x00pts / 5 \ x00 \ x00 / 5 \ x00 \ x00user \ x00 \ x00" Желаемый результат: [ "~", "очки / 5", "/ 5" , «пользователь»] выше строка просто пример - я хотел бы, чтобы удалить \ х .. (не-декодированные) байт. Я использую Python 3.2.3, и предпочел бы использовать только стандартные библиотеки.
5ba8cabe450348c7fbe2
1

голосов
1

ответ
266

Просмотры

BS.getLine и CRLF окончаний

Я пытаюсь удалить \ г от конца линии при использовании BS.getLine. Я попытался с помощью hSetNewlineMode и он работает с GetLine, но не с BS.getLine: импорт квалифицирован Data.ByteString.Char8 в BS импорта Data.ByteString (байтовой строки) импорт System.IO (hSetNewlineMode, universalNewlineMode, STDIN) главная = делать hSetNewlineMode STDIN universalNewlineMode - s
ErikR
1

голосов
1

ответ
76

Просмотры

Как выводить минимальные двоичный с использованием Data.Binary и Data.ByteString.Lazy?

Минимальный тестовый код (bs.hs): импорт квалифицирован Data.Binary как импорт B квалифицировался Data.ByteString.Lazy.Char8, как BSLC основных = делать BSLC.putStr $ B.encode $ Pad $ BSLC.pack "ххх" данные Pad = Pad BSLC.ByteString экземпляр B.Binary Pad, где положить (Pad р) = делать B.put р = прибудет делать р
uebayasi
1

голосов
1

ответ
391

Просмотры

Python как обрезать строку байтов

Я хочу, чтобы обрезать байт строку перед индексом найденного местоположения $$$, trimmed_bytes_stream = padded_bytes_stream [: padded_stream.index ( «$$$»)], но получил сообщение об ошибке: TypeError: а байт-подобный объект необходим, а не " ул»есть ли байты объекта эквивалентные методы, чтобы сделать это? Или преобразовать байты строки в строку, а затем с помощью методов строки? наконец, преобразовать обратно в байтах после обрезки?
daiyue
1

голосов
1

ответ
62

Просмотры

Binary file writer adds extra byte

Я строй Conduit, который записывает двоичный файл, состоящий из заголовка, за которым следует двойной матрица в виде ряда упорядоченного списка. Вот код: импорт Conduit (. (|), ConduitM, MAPC, sinkFileBS, выход) импорт Control.Monad.Trans.Except (Exceptt) импорт Control.Monad.Trans.Resource (ResourceT) импорт Data.ByteString (байтовой строки) импорт Data.ByteString.Conversion (toByteString ') импорт Data.Serialize.IEEE754 (putFloat64be) импорт Data.Serialize.Put (putListOf, runPut) импорт Data.Void (Пустота) импорт Numeric.LinearAlgebra.Data ((> ConduitM (Matrix Double) Пустота FileWriter () matrixSink путь = byteBuilder |. sinkFileBS путь, где byteBuilder = сделать выход $ toByteString» "заголовок" MAPC fromDoubleMatrix fromDoubleMatrix :: Матрица Double -> Байтовой строки матрицы fromDoubleMatrix = runPut $ putListOf putFloat64be (Concat toLists матрица) Это почти работает. Если я проверить его с помощью runExceptT. runConduitRes матрицы $ выхода. | matrixSink «test.dat», где матрица = (2> <2) [1, 2, 3, 4] Я получаю ожидаемый файл, но с дополнительным байтом между заголовком и списком двойников. При отображении с использованием показать дополнительные байты выглядят следующим образом: «\ NUL \ NUL \ NUL \ NUL \ NUL \ NUL \ NUL \ т» Любая идея, как не печатать эти байты? Или, если это каноническое сепаратор или что-то (так что я могу игнорировать его в считывающее устройство)? EDIT: Проблема, кажется, происходит в строительстве putListOf в fromDoubleMatrix. 4] Я получаю ожидаемый файл, но с дополнительным байтом между заголовком и списком двойников. При отображении с использованием показать дополнительные байты выглядят следующим образом: «\ NUL \ NUL \ NUL \ NUL \ NUL \ NUL \ NUL \ т» Любая идея, как не печатать эти байты? Или, если это каноническое сепаратор или что-то (так что я могу игнорировать его в считывающее устройство)? EDIT: Проблема, кажется, происходит в строительстве putListOf в fromDoubleMatrix. 4] Я получаю ожидаемый файл, но с дополнительным байтом между заголовком и списком двойников. При отображении с использованием показать дополнительные байты выглядят следующим образом: «\ NUL \ NUL \ NUL \ NUL \ NUL \ NUL \ NUL \ т» Любая идея, как не печатать эти байты? Или, если это каноническое сепаратор или что-то (так что я могу игнорировать его в считывающее устройство)? EDIT: Проблема, кажется, происходит в строительстве putListOf в fromDoubleMatrix.
jorgen
1

голосов
1

ответ
62

Просмотры

Записывать все запросы и ответы на HTTP-канал

Я написал это ManagerSettings регистрировать все запросы и ответы для моего приложения HTTP-трубопровода. (Кстати, я ввожу ClassyPrelude). tracingManagerSettings :: ManagerSettings tracingManagerSettings = tlsManagerSettings {managerModifyRequest = \ REQ -> сделать putStr "СЛЕД:" печать REQ putStrLn "" чистый REQ, managerModifyResponse = \ г -> делать responseChunks
Robin Green
1

голосов
1

ответ
68

Просмотры

Как сохранить, добавлять и читать список списков кортежей в том числе в файл, используя Data.Serialize и байтовой строки

Здравствуйте я имею проблемы чтения после сохранения и добавления списка списков кортежа внутри файла. Сохранение что-то в файл работает без проблем. Я спасаю в файл с импортом квалифицированных Data.ByteString как BS импорт квалифицированных Data.Serialize как S (декодирование, кодирующие) импортом Data.Either toFile пути = сделать пусть а = взять 1000 [100 ..] :: [Float] пусть б = взять 100 [1 ..] :: [Float] BS.appendFile путь $ S.encode (а, б) и чтение с пути FromFile = сделать BSTR
Ninexreaker
1

голосов
1

ответ
68

Просмотры

Как читать 5-байтовый вещь в `Word64` используя` binary`?

Можно ли читать 5-байтовый сегмент данных в word64, используя бинарный пакет, оставив три бита высшего порядка пусто? Или я должен использовать байтовую строку?
xuq01
1

голосов
2

ответ
634

Просмотры

Как заставить строгую оценку последовательности байтовой строки

У меня есть следующее определение типа Haskell: импорт Data.Sequence (Seq, длина) импорт Data.ByteString.UTF8 (байтовая строка) типа StringSeq = Seq байтовой строки У меня есть выражения типа StringSeq, для которых я хотел бы заставить строгую оценку с deepseq. Таким образом, мне нужно определить экземпляры NFData. Я сделал следующее: импорт Control.DeepSeq (NFData, deepseq) экземпляр NFData байтовой строки экземпляра NFData а => NFData (Seq а), где S = RNF RNF (длина s) Таким образом, я вычислить длину последовательности, чтобы заставить оценку последовательности сам. Это похоже на работу, но это правильное выполнение? Существуют ли более эффективные из них? Есть ли вычисление длины последовательности вводить слишком много накладных расходов?
Giorgio
1

голосов
2

ответ
554

Просмотры

Как соответствовать байтовой строки с байтом NUL?

Я хочу, чтобы разделить огромную (12 ГБ), ленивый байтовой строки с Regexp, что соответствует, среди прочего, NUL \ x00 байт. Я знаю, что это должно быть возможно, учитывая, что я был в состоянии разбить строку образца с питоном: >>> от повторного импорта раскол >>> раскол (б «\ x00», б «а \ x00b») [б «а», в '] Я не уверен, что она могла бы работать, но я хотел бы дать ему попробовать с Haskell, так как он должен быть в состоянии прочитать файл лениво и работать на нем без выделения памяти для всей строка. (Это должно быть легче, чем работать на нем кусок по-фрагмент, написание парсера или настройки исходной программы для вывода чего-то менее нарушен). Haskell соответствие регулярных выражений на байтовых строк достаточно легко: ( "а \ x01 \ & Ъ" :: байтовой строки) = ~ ( "\ x01" :: байтовой строки) :: (байтовой строки, байтовой строки, байтовой строки) ( "а", "\ SOH", "б") Но делать то же самое с \ x00 урожайности что-то странное: ( "а \ x00 \ & Ъ" :: байтовой строки) = ~ ( "\ x00" :: байтовой строки) :: (байтовой строки, байтовой строки , байтовой строки) ( «», «», «а \ NULb») Обратите внимание, что это не преминув найти матч (в противном случае первый элемент кортежа будет исходная строка), а это соответствие на невидимый / неявное \ x00, по-видимому. Любые намеки? s соответствие на невидимую / неявную \ x00 очевидно. Любые намеки? s соответствие на невидимую / неявную \ x00 очевидно. Любые намеки?
berdario
1

голосов
1

ответ
117

Просмотры

Переходя несколько байтовых строк в C

У меня есть функция C, которую я хочу подвергать Haskell с помощью FFI, которая принимает три строки: c_fun :: CString -> CString -> CString -> IO () Как я могу использовать useAsCString из Data.ByteString пройти 3 байтовые строки из Haskell? Т.е. я ищу для реализации следующих функций: haskellFun :: байтовой строки -> байтовой строки -> байтовой строки -> IO () useAsCString имеет тип байтовой строки -> (CString -> IO а) -> IO а, так это ясно, как использовать его с функцией, которая принимает один CString, но я не могу понять, как поместить его вместе с тремя.
jarmond
1

голосов
1

ответ
1.5k

Просмотры

Байтовой строки изображения в питона

Я использую API, который получает средства массовой информации, но API возвращает СМИ как байтовая строка ... Я хочу, чтобы сохранить байтовую строку в качестве изображения. Как мне это сделать? Я попытался это: данные = * * байтовой строки F = открытый ( 'image.jpg', 'ж') f.write (ул (данные)) f.close (), и это успешно компилируется, но когда я проверить изображение. JPG ... он пустой или «не может быть открыт, потому что это неизвестный формат»
shreyashirday
1

голосов
1

ответ
99

Просмотры

Формирование байтов по кусочкам и конкатенации байтов

Я пытаюсь отправить байты сообщение через TCP сокет. У меня есть один статические байты, который является шестигранным словом 0xAA. На статических байтах мне нужно сцепить динамические байты, который старший бит равен 0, то всегда меня есть биты из 6-4, которые являются переменными (от 000 до 100), а также, чем биты из 3-0 также варьируют (от 0000 - 1000). Что такое лучший способ сделать это? Я видел, что я могу использовать BitArray и BitArray класса от битовой строки, но я хотел бы знать, что является лучшим решением для этой задачи. Кроме того, я должен знать, как преобразовать BitArray обратно в байт, так что я могу отправить его с помощью TCP. Пример того, что мне нужно: leading_byte = 0xAA bit7 = 0 (бит) опция = { 'а': 000 (бит), 'б': 001 ...} версии = { 'я': 0000 (биты), «Я ': 0001 ...} bits6_4 = опция [' а '] = bits3_0 версии [' я»
sstevan
1

голосов
1

ответ
71

Просмотры

Построение RequestBodyStream от Ленивого байтовой строки, когда длина известна

Я пытаюсь адаптировать этот код загрузки AWS S3 для обработки Ленивый байтовой строки, где длина уже известна (так что он не обязан быть прочитан целиком в памяти - он приходит по сети, где длина отправляется заранее). Кажется, я должен определить функцию GivesPopper над Ленивый байтовой строки, чтобы преобразовать его в RequestBodyStream. Из-за запутанного пути определяется GivesPopper, я не знаю, как написать это для ленивых байтовой строки. Будет ли оценить указатели о том, как писать. Вот как это написано для чтения из файла: пусть файл = «тест» - потоки большого содержимого файла, без буферизации более 10k в памяти пусть кос мойку = withFile файл ReadMode $ \ ч -> тонуть $ S.hGet час 10240 стримеров в приведенном выше коде типа GivesPopper (), если я правильно понимаю. Учитывая Ленивую байтовую строку с известной длиной Len, что было бы хорошим способом написать функцию GivesPopper над ним? Мы можем прочитать одну порцию за один раз.
Sal
1

голосов
1

ответ
61

Просмотры

как декодировать кодированный дротика readAsBytesSync () строку в Python

Я посылаю файл типа изображения в облако сервер, написанный на Python. Прежде всего, я получаю содержимое файла в виде списка байт, то я преобразуя его в формат JSON для отправки на сервер. Список imageBytes = img.readAsBytesSync (); вар my_json = { "IMG": imageBytes}; вар кодируются = json.encode (my_json); вар канал = IOWebSocketChannel.connect ( "WS: //34.73.158.146: 5903"); channel.sink.add (кодируются); Так что, пожалуйста, скажите мне, как readAsBytesSync () преобразует изображение в байты, и как я могу преобразовать его обратно в изображение в питона. Также, пожалуйста, скажите мне, что это наиболее подходящий способ для кодирования и декодирования изображения типа файла в флаттера?
Zain Abedien
1

голосов
1

ответ
35

Просмотры

Различные представления класса «байт» в Python 3 [дубликата]

Этот вопрос уже есть ответ здесь: шестнадцатеричная строка в массив байт в питоне 8 ответов у меня есть две переменных класс байт в Python3. печать (string1) -> b'2900BCE03604093C000080' печати (bytes.fromhex (string1.decode ( 'utf8'))) -> Ь ') \ x00 \ XBC \ xe06 \ x04 \ т
Johannes
1

голосов
1

ответ
157

Просмотры

Lazy ByteString strange behaviour or bug?

When I'm testing my function intervalFinder in GHCI it seems to be working, but when I try to compile it, I have NO output: The function works on the input: *Main> intervalFinder $[B.pack"first",B.pack"second",B.empty,B.pack"third",B.emp ty] Loading package bytestring-0.9.2.1 ... linking ... done. ["Start Time: first","End Time: second","Start Time: third","End Time: third "] And running main: *Main> main Loading package bytestring-0.9.2.1 ... linking ... done. *Main> :q Leaving GHCi. prints in results.txt: Start Time: firstEnd Time: secondStart Time: thirdEnd Time: third but if I run ghc test3.hs,the output file is 0kb (and obviously no data in it!) Am I doing something wrong? Code: {-# LANGUAGE OverloadedStrings #-} import qualified Data.ByteString.Char8 as B import qualified Data.ByteString.Lazy.Char8 as Bl import System.IO import System.Environment intervalFinder :: [B.ByteString]->[B.ByteString] intervalFinder x = helper x "" where helper (x:xs) "" | x /= "" = ((B.append (B.pack("Start Time: ")) x)):(helper xs x) | otherwise = helper xs "" helper (x:xs) y | x == "" = ( (B.append (B.pack("End Time: ")) y)):(helper xs "") | otherwise = helper xs x helper _ _ = [] main = do filehandle
MdxBhmt
1

голосов
2

ответ
361

Просмотры

Почему создание и удаление временных байтовых строк съедает мою память в Haskell?

Вот код, который создает номера 1M Int и поместить их в список. Основные = делать пусть л = [1..1000000] putStrLn $ показать $ Сумма (foldl (\ Окс -> Р: посыла) [] л) (я знаю, что это может быть более оптимальным (сумма в складку), но моя точка отличается.) И посмотреть на этой версии импорт квалифицированных Data.ByteString.Lazy.Char8, как импорт B квалифицированных Data.ByteString.Lazy.Builder в Builder импорт Data.ByteString.Lazy.Builder.ASCII импорта Data.Maybe импорта Data.List магистраль = дайте л = отображение (Builder.toLazyByteString intDec.) [1..1000000] пусть l2 = карта (FST fromJust B.readInt.). л putStrLn $ показать $ суммы (foldl»(\ Окс р -> р: всп ) [] l2) Эта версия нуждается в 90MB памяти! Зачем? Вот это профилирование выхода Что такое фиолетовая область? EDIT после прочтения комментариев я хотел бы добавить некоторые разъяснения. Это тест. Я хочу, чтобы число 1M в памяти (я создаю таблицу поиска). Так что я «хочу, чтобы заставить весь список, который пройдет в памяти». Но я не хочу, чтобы держать байтовые строки. Мой небольшой код моделирование случая, когда я загрузить байтовые строки с диска, преобразовать его в целые числа и держать целые числа в памяти. (Это моя цель). Но как-то байтовые строки остаются в памяти. Зачем?
halacsy
1

голосов
2

ответ
60

Просмотры

Универсальный и эффективный способ для разбора различных видов чисел из байтовых строк в Haskell

Вот то, что я мог придумать, но я не думаю, что это очень эффективно и безопасно: импорт квалифицирован Data.ByteString.Char8, как В8 convert2Int = читать. B8.unpack Есть ли лучший способ сделать это? Я нашел функцию в библиотеках, которые делают это для типа Int, но не для других типов, таких как Int32, Int64, word64 и т.д.
donatello
2

голосов
2

ответ
606

Просмотры

как ошибка avoide путь «TypeError: а байт-подобный объект необходим, а не„ул“» в Scrapy

start_urls = [ 'https://github.com/login'] Защиту синтаксического анализа (я, ответ): возвращение scrapy.FormRequest.from_response (ответ, FormData = { 'логин': 'хх', 'пароль': 'хх' }, обратный вызов = self.after_login) защиту after_login (сам, ответ): если "Ошибка аутентификации" в response.body: self.logger.info ( "сбой хх% s", response.body) Я попробовал код выше со ссылкой к документу, но произошло следующее сообщение об ошибке. если «Ошибка аутентификации» в response.body: TypeError: а байт-подобный объект требуется, а не «ул» Это выглядит как двоичный файл в response.body. Есть ли способ избежать этой ошибки? и я Любопытно, что в целом, если Логин не удается, «не аутентификации», отображается ли в ответ. тело? Спасибо за чтение моего вопроса.
jihyun kim
1

голосов
2

ответ
1.4k

Просмотры

Преобразование смещения символов в смещения байт (в Python)

Предположим, у меня есть куча файлов в UTF-8, что я посылаю к внешнему API в Unicode. API работает на каждой строке Юникода и возвращает список с (character_offset, подстрока) кортежей. Выход мне нужно, это начало и конец байт смещения для каждой найденной подстроки. Если мне повезет вводимый текст содержит только символы ASCII (что делает символ смещение и смещение байта идентичен), но это не всегда так. Как я могу найти начало и конец смещения байта для известного начинают характер смещения и подстроки? Я ответил на этот вопрос сам, но с нетерпением жду других решений этой проблемы, которые являются более надежными, более эффективными, и / или более удобным для чтения.
AliOli
1

голосов
1

ответ
826

Просмотры

Преобразование литералов гольцов в Word8

Документация для байтовой строки дает следующий пример кода: breakByte :: Word8 -> байтовой строки -> (байтовой строки, байтовой строки) breakByte «с» «ABCD» Однако, когда я пишу то же самое я получаю следующее сообщение об ошибке (ideone): Может не соответствовать Ожидаемый тип `GHC.Word.Word8' с фактическим типом` Ch»конечно„с“является Char, не Word8. Предположительно, они используют некоторое расширение, которое позволяет функции fromInteger стиль автоматически работать на Char литералов, но я не уверен, что. {- # LANGUAGE OverloadedStrings # -}, кажется, не имеет никакого значения.
Clinton
5

голосов
2

ответ
543

Просмотры

Формат PHP байт для перевода Javascript

Не совсем вопрос, но своего рода вызов .. У меня есть эта функция PHP, что я всегда использую, и теперь мне нужно это в JavaScript. Функция formatBytes ($ байт, $ точность = 0) {$ единиц = массив ( 'B', 'KB', 'МБ', 'GB', 'ТБ'); $ Байт = макс ($ байт, 0); $ Пау = пол (? ($ Байт журнала ($ байт): 0) / журнал (1024)); $ Пау = мин ($ пау, граф ($ единиц) - 1); $ Байт / = пау (1024, $ пау); вернуться круглые ($ байт, $ точности). ''. $ единиц [$ пау]; } EDIT: Благодаря ответам я пришел с более коротким, но без точности (дайте мне знать, если у вас есть какие-то вторые мысли) функции format_bytes (размер) {вар база = Math.log (размер) / Math.log (1024) ; Суффиксы вар = [ 'B', 'КБ', 'МБ', 'GB', 'TB', 'PB', 'EB']; Возвращение Math.round (Math.pow (1024, Основание - Math.floor (основание)), 0) + '' + суффиксы [Math.floor (основание)]; }
FFish
17

голосов
1

ответ
3.9k

Просмотры

Не удался соответствовать ожидаемому типу `Data.ByteString.Internal.ByteString«с фактическим типом `байтовой строки»

Запуск следующий код: импорт Crypto.BCrypt импорта Data.ByteString.Lazy.Char8 основных = делать maybe_pwhash
hugomg
17

голосов
1

ответ
2k

Просмотры

Чтение больших файлов в Haskell?

я пытался прочитать большой файл в Haskell. Мне нужно, чтобы сжать его с помощью пользовательского алгоритма для университетского проекта. Все работает отлично, пока я начала сжимать большие файлы. Я извлек, что происходит неправильно из моей программы, и я выставить его здесь в виде «Hello большой файл»: импорт импорта системы квалифицированных Data.ByteString.Lazy, как BL импорт Data.Word fold_tailrec :: (а -> Ь -> а) -> а -> [Ь] -> а fold_tailrec _ согласно [] = согласно fold_tailrec foldFun согласно (х: XS) = fold_tailrec foldFun (foldFun согласно х) хз fold_tailrec»:: (а -> б -> а) -> а -> [Ь] -> а fold_tailrec '_ согласно [] = согласно fold_tailrec' foldFun согласно (х: хз) = пусть forceEval = fold_tailrec»foldFun (foldFun согласно х) в последовательности хз forceEval forceEval главная :: IO () основные = сделать арг
Joel
1

голосов
2

ответ
208

Просмотры

Haskell - Как вы предварять байтовую строку с его длиной в двоичном?

Я нахожусь в неблагоприятной ситуации, когда мне нужно взаимодействовать с Java API сокетов непосредственно в Haskell. Путь Java Строки передаются через провод с их длиной добавляется в начало строки. Например: \ 0 \ 0 \ 0 \ xBHello мира является строка «Hello World» Я могу получить длину из не байтовой строки не проблема, но как Int. Я могу добавить Word32 к байтовой строки с помощью Blaze Builder, но я не могу найти удобный способ, чтобы преобразовать Int в Word32. Есть ли какой-нибудь метод, позволяющий найти не могу сделать это? Благодарю.
Joe Hillenbrand
17

голосов
5

ответ
8.1k

Просмотры

Преобразование Ленивый байтовой строки строгой байтовой строки

У меня есть функция, которая принимает ленивую байтовую строку, которые я хочу иметь возвращаемые списки строгих байтовых строк (лени должны быть переданы типа списка на выходе). импорт квалифицировано Data.ByteString как импорт B квалифицированные Data.ByteString.Lazy, как L csVals :: L.ByteString -> [B.ByteString] Я хочу сделать это по разным причинам, некоторые функции лексических требуют строгих байтовых строк, и я могу гарантировать выводимые строгие байтовые строки в выходе csVals выше, очень малы. Как я могу идти о «strictifying» байтовых строк без комков их? Update0 Я хочу взять Ленивую байтовую строку, и сделать одно строгую байтовую строку, содержащей все данные.
Matt Joiner
18

голосов
2

ответ
10k

Просмотры

Haskell Как конвертировать Char в Word8

Я хочу разделить байтовой строки на слова следующим образом: импорт квалифицирован Data.ByteString, как BS основные = сделать вход Word8 и Word.Word8 «» недействителен конструктор типа. Любые идеи о том, как это исправить?
Andrew
2

голосов
1

ответ
1.7k

Просмотры

Как я могу определить, является ли Akka байтовой строка содержит заданную подстроку?

Дан текстовый файл, пример, как можно использовать AKKA байтовых строк и либо преобразовать его в обычный текст или запустить «найти» на самом байтовой строки? вал файл = новый файл ( "sample.txt") Вал fileSource = SynchronousFileSource (файл, 4096) Вэл messageStream = fileSource.map (порция => SendMessage (chunk.toString ())) messageStream.to (Sink.foreach (Println ( _))). запустить «ToString ()» функциональность выше буквально выкладывает строку, содержащую текст «байтовой строки», за которым следует байт, представленных в виде целых чисел. Например: chunk.toString () ==> "байт (111, 112, 119, 111)"
Rubber Duck
2

голосов
1

ответ
145

Просмотры

Как получить строку из Lazy.Builder?

Мне нужно манипулировать двоичное кодирование как «0» и «1» простых строк данных в качестве входных данных, используя ASCII 7-бит. Для кодирования я использовал функцию Data.ByteString.Lazy.Builder.string7 :: String -> Builder Однако я не нашел способ преобразовать обратно полученный объект Builder в строку «0» и «1». Является ли это возможным ? Есть ли другой способ? Вспомогательный вопрос: А если бы я хотел его в шестнадцатеричном виде как текст?
Stephane Rolland
19

голосов
1

ответ
898

Просмотры

Haskell iteratee: простой обработанный пример зачистки завершающего пробельного

Я пытаюсь понять, как использовать библиотеку iteratee с Haskell. Все статьи, которые я видел до сих пор, кажется, сосредоточиться на создании интуиции для того, как iteratees может быть построен, который является полезным, но теперь, когда я хочу, чтобы получить вниз и на самом деле их использовать, я чувствую себя немного на море. Глядя на исходный код iteratees имеет ограниченную ценность для меня. Скажем, у меня есть эта функция, которая урезает завершающие пробельные из строки: импорт Data.ByteString.Char8 rstrip :: байтовой строки -> байтовой строки rstrip = FST. spanEnd isSpace Что я хотел бы сделать, это: сделать это в iteratee, прочитать файл и записать его где-то еще с задним пробельным раздели из каждой строки. Как бы идти о структуризации, что с iteratees? Я вижу, что есть функция enumLinesBS в Data.Iteratee.Char, которую я мог бы отвес в это, но я не»
Daniel Lyons
5

голосов
2

ответ
161

Просмотры

ByteString concatMap performance

I have a 37MB bin file I am trying to convert to a ppm sequence. It works fine, and I'm trying to use this as an exercise to learn some profiling and more about lazy bytestrings in Haskell. My program seems to bomb at the concatMap, which is used to replicate each byte three times so I have R, G, and B. The code is fairly straight forward - every 2048 bytes I write a new header: {-# LANGUAGE OverloadedStrings #-} import System.IO import System.Environment import Control.Monad import qualified Data.ByteString.Lazy.Char8 as B main :: IO () main = do [from, to] withFile to WriteMode $ \outH -> loop (B.hGet inH 2048) (process outH) B.null loop :: (Monad m) => m a -> (a -> m ()) -> (a -> Bool) -> m () loop inp outp done = inp >>= \x -> unless (done x) (outp x >> loop inp outp done) process :: Handle -> B.ByteString -> IO () process h bs | B.null bs = return () | otherwise = B.hPut h header >> B.hPut h bs' where header = "P6\n32 64\n255\n" :: B.ByteString bs' = B.concatMap (B.replicate 3) bs This pulls it off in a little over 5s. It's not terrible, and my only comparison is my very naive C implementation that does it a little under 4s - so that or ideally under has been my goal. Here is the RTS from the above code: 33,435,345,688 bytes allocated in the heap 14,963,640 bytes copied during GC 54,640 bytes maximum residency (77 sample(s)) 21,136 bytes maximum slop 2 MB total memory in use (0 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 64604 colls, 0 par 0.20s 0.25s 0.0000s 0.0001s Gen 1 77 colls, 0 par 0.00s 0.01s 0.0001s 0.0006s INIT time 0.00s ( 0.00s elapsed) MUT time 5.09s ( 5.27s elapsed) GC time 0.21s ( 0.26s elapsed) EXIT time 0.00s ( 0.00s elapsed) Total time 5.29s ( 5.52s elapsed) %GC time 3.9% (4.6% elapsed) Alloc rate 6,574,783,667 bytes per MUT second Productivity 96.1% of total user, 92.1% of total elapsed Pretty gnarly results. When I remove the concatMap and just copy everything over with the headers every 2048 bytes, it's practically instant: 70,983,992 bytes allocated in the heap 48,912 bytes copied during GC 54,640 bytes maximum residency (2 sample(s)) 19,744 bytes maximum slop 1 MB total memory in use (0 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 204 colls, 0 par 0.00s 0.00s 0.0000s 0.0000s Gen 1 2 colls, 0 par 0.00s 0.00s 0.0001s 0.0001s INIT time 0.00s ( 0.00s elapsed) MUT time 0.01s ( 0.07s elapsed) GC time 0.00s ( 0.00s elapsed) EXIT time 0.00s ( 0.00s elapsed) Total time 0.02s ( 0.07s elapsed) %GC time 9.6% (2.9% elapsed) Alloc rate 5,026,838,892 bytes per MUT second Productivity 89.8% of total user, 22.3% of total elapsed So I guess my question is two fold: How can I improve the overall performance? And had the bottleneck not been so obvious, what are some ways I could have tracked it down? Thank you. Edit Here's the final code and RTS if anyone is interested! I was also able to find additional bottlenecks by making use of ghc's profiler with -prof -auto-all -caf-all after reading up on the Profiling and optimization chapter of Real World Haskell. {-# LANGUAGE OverloadedStrings #-} import System.IO import System.Environment import Control.Monad import Data.Monoid import qualified Data.ByteString.Builder as BU import qualified Data.ByteString.Lazy.Char8 as BL main :: IO () main = do [from, to] withFile to WriteMode $ \outH -> loop (BL.hGet inH 2048) (process outH) BL.null loop :: (Monad m) => m a -> (a -> m ()) -> (a -> Bool) -> m () loop inp outp done = inp >>= \x -> unless (done x) (outp x >> loop inp outp done) upConcatMap :: Monoid c => (Char -> c) -> BL.ByteString -> c upConcatMap f bs = mconcat . map f $ BL.unpack bs process :: Handle -> BL.ByteString -> IO () process h bs | BL.null bs = return () | otherwise = BU.hPutBuilder h frame where header = "P6\n32 64\n255\n" bs' = BU.toLazyByteString $ upConcatMap trip bs frame = BU.lazyByteString $ mappend header bs' trip c = let b = BU.char8 c in mconcat [b, b, b] 6,383,263,640 bytes allocated in the heap 18,596,984 bytes copied during GC 54,640 bytes maximum residency (2 sample(s)) 31,056 bytes maximum slop 1 MB total memory in use (0 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 11165 colls, 0 par 0.06s 0.06s 0.0000s 0.0001s Gen 1 2 colls, 0 par 0.00s 0.00s 0.0001s 0.0002s INIT time 0.00s ( 0.00s elapsed) MUT time 0.69s ( 0.83s elapsed) GC time 0.06s ( 0.06s elapsed) EXIT time 0.00s ( 0.00s elapsed) Total time 0.75s ( 0.89s elapsed) %GC time 7.4% (7.2% elapsed) Alloc rate 9,194,103,284 bytes per MUT second Productivity 92.6% of total user, 78.0% of total elapsed
sudochop
5

голосов
1

ответ
200

Просмотры

OverloadedStrings для символов [дубликат]

Этот вопрос уже есть ответ здесь: Haskell Как конвертировать Char в Word8 2 ответы Документация hackage для байтовой строки содержит следующий пример: сплит :: Word8 -> байтовой строки -> [байтовой строки] Раскол «\ п» «а \ пь \ й \ пе»== [„а“,„б“,„д“,„е“] Это как если бы„\ п“преобразуется в Word8, но ЯЗЫКА OverloadedStrings только кажется, работать со строками, а не символов. Что расширение I должны включать в пример кода для работы?
Clinton
6

голосов
3

ответ
2.5k

Просмотры

Использование Парсек Haskell для разбора байтовой строки

Я сумел использовать Парсек разобрать строку, но не удается сделать то же самое с байтовой строки. Как я могу сделать парсеки работы с байтовыми строками без ручного преобразования их в строках? Я получаю чувство, что это не трудно сделать. Я ошибся? (Я новичок в Haskell. ^^) Спасибо!
6

голосов
2

ответ
419

Просмотры

Как я могу преобразовать (StorableArray (Int, Int) Word8) в ленивой байтовой строки?

Я пытаюсь загрузить файл PNG, получить несжатые байты RGBA, а затем отправить их в GZIP или ZLIB пакеты. Пакет pngload возвращает данные изображения в качестве (StorableArray (Int, Int) Word8), а пакеты сжатия принимают ленивые байтовые строки. Поэтому я пытаюсь построить (StorableArray (Int, Int) Word8 -> байтовой строки) функции. До сих пор, я попробовал следующее: импорт квалифицирован Codec.Image.PNG в PNG импорт Control.Monad (mapM) импорт Data.Array.Storable (withStorableArray) импорт квалифицированных Data.ByteString.Lazy, как LB (байтовой строки, пакет, взять) импорт Data.Word (Word8) импорт иностранных (PTR, peekByteOff) основные = сделать - Загрузить PNG в "изображение" ... байт Ptr Word8 -> IO LB.ByteString bytesFromPointer подсчитывать указатель = LB.pack $ mapM (указатель peekByteOff) [0 .. (кол-1)] Это вызывает стек, чтобы запустить из памяти, так ясно, что я делаю что-то очень неправильно. Есть еще вещи, которые я мог бы попробовать с ПВП и ForeignPtr, но есть много «опасные» функции там. Любая помощь здесь была бы оценена; Я довольно тупик.
Keith Holman
6

голосов
1

ответ
262

Просмотры

Получить магическое число из индекса packfile мерзавца в Haskell

Я хотел, чтобы получить магическое число из индекса мерзавец packfile, чтобы убедиться, что это действительно packfile. Документация в формате пакета указывается, что магическое число «/ 377tOc». Когда я открываю packfile с Рубином, например, я получаю это назад при чтении файла:> File.open ( «пакет-4412d2306cfe9a0b6d1b9b4430abc767022e8a3c.idx») чтение (4) => «\ 377tOc» Но в Haskell я получаю это.: > ч Data.ByteString.hGet ч 4 => «\ 255tOc» Я принимаю это я что-то очевидное отсутствует, но это не для меня ясно, что это такое. Что я делаю неправильно здесь?
luke_randall
6

голосов
2

ответ
1.8k

Просмотры

IO над большими файлами в Haskell: вопрос производительности

Я пытаюсь работать над большими файлами с помощью Haskell. Я хотел бы, чтобы просмотреть входной файл байт за байтом, и генерировать выходной байт после байта. Конечно, мне нужно IO быть помещены в буфер с блоками разумного размера (несколько килобайт). Я не могу это сделать, и мне нужна ваша помощь, пожалуйста. импорт импорта системы квалифицированных Data.ByteString.Lazy, как BL импорт Data.Word импорта Data.List главной :: IO () основные = сделать арг
Joel
5

голосов
2

ответ
97

Просмотры

IOUArray to ByteSring, as quickly as possible

Мне нужно очень быстро мутировать элементы в массиве фиксированного размера в Word8. Для этого я использую IOUArray. Мне нужно отправить этот массив через соединение WebSocket. Функция sendBinaryData из пакета WebSockets требует байтовой строки. Мне нужно преобразовать из одного представления в другое. Я использую эту функцию в настоящее время: arrayToBS :: IOUArray Int Word8 -> IO (BS.ByteString) arrayToBS = (БПМЖ BS.pack). getElems Эта функция преобразует элементы массива к [Word8] перед упаковкой, что список в виде массива байт, и из профилирование я могу видеть, что это довольно медленно. Мне было интересно, если есть способ ускорить эту функцию, или, возможно, отправить массив через подключение WebSocket напрямую? Массив, который я использую в настоящее время является: размер = 1000; numBytes = размер * размер * 4 newBuffer :: IO (IOUArray Int Word8) newBuffer = newArray (0, numBytes) 200 :: IO (IOUArray Int Word8) и исключением из отчета об исполнении: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 28: 1-37 88,1 99,0 newBuffer Lib ЦСИ / Lib.hs: (23,1) - (25,12) 9,9 0,8 в идеале arrayToBS бы гораздо быстрее, чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1 IO (IOUArray Int Word8) и исключением из отчета об исполнении: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 28: 1-37 88,1 99,0 newBuffer Lib ЦСИ / Lib.hs: (23,1) - (25,12) 9,9 0,8 в идеале arrayToBS бы гораздо быстрее, чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1 IO (IOUArray Int Word8) и исключением из отчета об исполнении: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 28: 1-37 88,1 99,0 newBuffer Lib ЦСИ / Lib.hs: (23,1) - (25,12) 9,9 0,8 в идеале arrayToBS бы гораздо быстрее, чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1 COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 28: 1-37 88,1 99,0 newBuffer Lib ЦСИ / Lib.hs: (23,1) - (25,12) 9,9 0,8 В идеале arrayToBS бы намного быстрее чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1 COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 28: 1-37 88,1 99,0 newBuffer Lib ЦСИ / Lib.hs: (23,1) - (25,12) 9,9 0,8 В идеале arrayToBS бы намного быстрее чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1 8 В идеале arrayToBS бы гораздо быстрее, чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1 8 В идеале arrayToBS бы гораздо быстрее, чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1
felixgb
5

голосов
2

ответ
787

Просмотры

Haskell ByteStrings - ending up with large file loaded into memory

Greetings, I'm trying to understand why I'm seeing the entire file loaded into memory with the following program, yet if you comment out the line below "(***)" then the program runs in constant (about 1.5M) space. EDIT: The file is about 660MB, the field in column 26 is a date string like '2009-10-01', and there are one million lines. The process uses about 810MB by the time it hits the 'getLine' Am I right in thinking it's related to the splitting of the string using 'split', and that somehow the underlying ByteString that has been read from the file can't be garbage-collected because it's still referenced? But if so, then I thought BS.copy would work around that. Any ideas how to force the computation - I can't seem to get 'seq' into the right place to have an effect. (NB the source file is tab-separated lines) Thanks in advance, Kevin module Main where import System.IO import qualified Data.ByteString.Lazy.Char8 as BS import Control.Monad type Record = BS.ByteString importRecords :: String -> IO [Record] importRecords filename = do liftM (map importRecord.BS.lines) (BS.readFile filename) importRecord :: BS.ByteString -> Record importRecord txt = r where r = getField 26 getField f = BS.copy $ ((BS.split '\t' txt) !! f) loopInput :: [Record] -> IO () loopInput jrs = do putStrLn $ "Done" ++ (show $ last jrs) hFlush stdout x
Kevin

Просмотр дополнительных вопросов