问题标签 [bytestring]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 如何强制对 ByteString 序列进行严格评估
我有以下 Haskell 类型定义:
我有类型StringSeq
的表达式,我想用deepseq
. 所以我需要定义NFData
. 我做了以下事情:
所以我计算一个序列的长度来强制评估序列本身。这似乎可行,但这是正确的实现吗?有更好的吗?计算序列的长度是否会引入过多的开销?
haskell - 将字符串的 UTF-8 编码存储在 ByteString 中
所以我想访问字符串的 UTF-8 编码的各个字节。
我尝试使用Data.ByteString.Char8.pack
,但这似乎只是将其截断为每个字符的最后一个字节:
如果我可以从文件中读取字符串,这不是问题:
但我想要一种String -> ByteString
无需截断的纯粹转换方式,而hoogle 并不是很有帮助。
performance - Int 比较比 Haskell 中的 ByteString 比较快多少?
我正在实现模式挖掘算法,通常输入数据是具有以下格式的文件
通常itemx
是一个String
。为了提高效率,我曾经读取ByteString
比默认文件更快的文件String
。由于模式挖掘算法的主要任务是项目集之间的比较。我想知道如果我更改输入文件格式以便进行比较Int
而不是比较ByteString
. 这是新颖的格式:
谢谢 !
haskell - 如何将 ByteString 转换为 Int 并处理字节序?
我需要在 Haskell 中读取二进制格式。格式相当简单:四个八位字节表示数据的长度,然后是数据。四个八位字节表示网络字节顺序中的整数。
如何将ByteString
四个字节的 a 转换为整数?我想要一个直接转换(在 C 中,那将是*(int*)&data
),而不是字典转换。另外,我将如何处理字节顺序?序列化的整数按网络字节顺序排列,但机器可能使用不同的字节顺序。
我尝试了谷歌搜索,但只有关于字典转换的结果。
bytestring - 是什么让 ByteString IO 如此之快?
我一直在尝试从 Haskell 的 acm.timus.ru解决问题 1330 。基本上,它归结为: 1) 从标准输入中读取一个长度为 N (N < 10^4) 和 M 对整数 (M < 10^5) 的数组 A;2) 对于每个 (from, to) 对,将子数组 A[from..to] 的总和打印到标准输出。
由于 SO 不允许我在此问题中发布超过 2 个 URL,因此我将参考下面我的Github 存储库中的文件。
我想出了两个解决方案,它们共享大部分代码。第一个(1330_slow.hs)使用 Prelude 函数(getLine/read/words)并且有点慢:
另一个解决方案 (1330.hs) 抛弃了这些函数,用它们的 Data.ByteString.Char8 等效项 (B.getLine/B.readInt/B.words) 替换它们,并且表现得很好:
这个问题的时间限制是 500 毫秒,所以虽然 270 毫秒已经足够快(并且可以与我在其他语言中的解决方案相媲美,例如 C++ 和 Go),但 2180 毫秒并没有减少它。那么为什么我的第一个解决方案如此缓慢呢?即使按照 Real World Haskell 的分析技巧,我仍然无法理解这一点(我所能弄清楚的是大部分时间都花在了 readIntPair 函数上,这并没有太大帮助)。
如果你想自己做一些测试,我有一个 Python 输入生成器 (gen_test.py) 和一个预生成的输入文件 (input.txt),以防你没有安装 Python。以及两种解决方案之间的差异(slow_fast_diff.txt)。
haskell - 从 Bytestring 中获取任意位片
我想用一个lazyBytestring
来表示一个比特流。我需要能够有效地从该流中获取任意位片。例如,我可能有一个ByteString
长度为 10 的 a,我想ByteString
从原始的ByteString
.
问题是sByteStrings
的数组Word8
,所以取不是 8 的倍数的范围很困难。我能想到的最好的就是这个,使用Data.Binary
and Data.Binary.Bits
。请注意,这get32BitRange
专门针对范围 <= 32。
算法是:
- 找到第一个
Word8
包含我想要的位的索引 - 从最高下降
ByteString
到该指数 - 如果位范围的低端不是 8 的倍数,则在 的开头会有一些多余的位
Word8
,所以跳过那些 - 获取 (hi - lo) 位,并存储在
Word32
- 把它
Word32
放进一个ByteString
它看起来有点难看,有没有更有效的方法可以从 a 中获取任意切片ByteString
?
编辑:这是一个更有效的版本
parsec - 在 Parsec 中匹配字节串
我目前正在尝试使用Real World Haskell中提供的 Full CSV Parser 。为了我尝试修改代码以使用ByteString
而不是String
,但是有一个string
只适用于String
.
是否有类似于与 一起使用的 Parsec 组合器string
,ByteString
而无需来回进行转换?
我已经看到有一个替代解析器可以处理ByteString
: attoparsec
,但我更愿意坚持使用 Parsec,因为我只是在学习如何使用它。
haskell - 是否有惰性`ByteString`的参数版本?
我的理解是ByteString
s 只是 s 的向量列表Word8
。这种封装在二进制流上提供了更好的内存和速度性能。同样,该Text
类型提高了Char
流的性能。
但是,如果我有Int
流或Double
流怎么办?是否有ByteString
易于与不同数据类型一起使用的参数版本?我认为只在不可装箱的类型上使用才有意义。
haskell - 获取 ByteString 的子字符串的惯用方法
我需要广泛使用:
两部分问题:
- 这已经有名字了吗?我在 Hoogle 上找不到任何搜索该类型的东西,但它似乎应该是一个非常普遍的需求。我还尝试搜索
(Int, Int) -> ByteString -> ByteString
和一些flip
相同的版本。我还尝试寻找[a]
版本以查看是否有常用名称。 - 有没有更好的写法?
我怀疑我做错了什么,因为我强烈希望能找到很多人走上同一条路,但我的 google-fu 没有找到任何东西。