问题标签 [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 - 将字节字符串部分解码为文本
我需要将 ByteStrings 从各种编码解码为 Text,但 ByteStrings 可能是不完整的片段。理想情况下,我需要一个具有以下签名的函数:
它返回成功解码的 Text 以及未形成完整 unicode 字符的任何剩余字节(因此我可以在获得下一个片段时重新使用这些字节)。
这种功能是否已经存在于一些 Haskell 库中,还是我需要自己推出?现在,我什至可以开始使用不支持 UTF-8 以外的编码的东西。
haskell - Haskell Bytestring改变ASCII?
如何从字节串中获取特定字符,然后更改其 ASCII,然后将其放回原处?我使用 readInt 还是什么?
例如: "aaaaa" ,"a" 是 97 所以减去 1 并且你有 "aa`aa"
haskell - Haskell Bytestring 打包/解包
我仍然不明白字节串是如何工作的
我知道字节串可用于读取大量数据,非常快速有效。但是拆开包装没有意义。
你不能不解包就读取字节串形式的数据吗?或者只是解压一部分数据?
你能解释一下它是如何工作的吗?(代码示例)
haskell - Haskell 中的位交换问题
作为学校项目的一部分,我在 Haskell 中实现了一些加密算法。正如您可能知道的那样,这涉及到相当多的低级位摆弄。现在我被困在一个让我头疼的特定子程序上。该例程是 256 位的排列,其工作原理如下:
输入:一个 256 位块。
然后将输入块中的所有偶数位 (0,2,...) 作为输出块中的前 128 位。而奇数位被视为输出块中的最后 128 个位。更具体地说,输出中第 i位的公式为(a i是输入块中的第 i位,b 是输出):
b i = a 2i
b i+2 d-1 = a 2i + 1
对于i从 0 到 2 d-1 -1,d = 8。
作为一个玩具示例,假设我们使用了使用 16 位块而不是 256 位的例程的简化版本。然后以下位串将被排列如下:
1010 1010 1010 1010 -> 1111 1111 0000 0000
我还没有为这个函数想出一个干净的实现。特别是我一直在尝试使用 ByteString -> ByteString 签名,但这会迫使我使用 Word8 的粒度。但是输出字节串中的每个字节都是所有其他字节中位的函数,这需要一些非常混乱的操作。
对于如何解决此问题的任何提示或建议,我将不胜感激。
parsing - 如何将 ByteString 转换为适当大小的 Word?
基本上我已经读取了对应于数量的 5 个字节,但我想将其转换为 Word64。最好的方法是什么?
编辑:我还应该说这是在内部循环中运行的,因此性能至关重要。理想情况下,我想做类似的事情:
或类似的东西。
haskell - Data.ByteString.Lazy 中块的大小
模块Data.ByteString.Lazy
包含自己的ByteString
类型实现:
并且有以下关于块大小的短语:
默认的块大小是 64k,在大多数情况下应该是好的。对于具有大型 L2 缓存的人,您可能希望增加此值以适应您的缓存。
但没有关于如何做到这一点。如何增加默认块大小?另外,如果卡盘大小会显着大于那些 L2 缓存,我是否会获得性能提升?
haskell - 将惰性字节字符串转换为严格字节字符串
我有一个带有惰性ByteString
的函数,我希望返回严格ByteStrings
的列表(惰性应该转移到输出的列表类型)。
我想这样做是出于各种原因,几个词法函数需要 strict ByteString
,我可以保证上面ByteString
s 的输出中输出的 strictcsVal
非常小。
我如何在ByteString
不分块的情况下进行“严格化” ?
更新0
我想要一个 Lazy ByteString
,并严格ByteString
包含它的所有数据。
haskell - 高效地将 64 位 Double 转换为 ByteString
我编写了一个将 64 位 Double 转换为 ByteString 的函数(架构/类型安全并不是真正的问题——让我们现在假设 Double 是 64 位 Word)。虽然下面的函数运行良好,但我想知道是否有更快的方法将 Double 转换为 ByteString。在下面的代码中,有一个将 Word64 解包到 Word8 列表中,然后是反向(使其成为小端格式),然后打包到 ByteString 中。代码如下:
Mac x86 上的示例 GHCi 输出:
虽然代码似乎运行良好,但我计划在通过 IPC 发送之前将大量 Double 值编码为 ByteString。因此,如果有的话,我将不胜感激有关使其更快的指示。
在我看来,必须将 double 解压缩到 Word8 中,然后再打包到 ByteString 中。所以,可能是整体算法,不能改进太多。但是,如果有的话,使用更有效的解包/打包功能可能会有所作为。
EDIT1: 我刚刚在 Mac (GHC 7.0.3) 上发现了另一个并发症——由于这个错误,上面的代码无法在 GHC 中编译——到目前为止我正在 GHCi 中进行测试:
所以,看起来我必须依靠 FFI(谷物/数据二进制 ieee754 包),直到这个错误被修复,或者直到我找到解决方法。看起来与GHC Ticket 4092有关。如果这是一个新错误或不同的错误,请纠正我。目前,我无法编译它:(
EDIT2: 更新代码以使用 unsafeCoerce 修复了编译问题。下面的代码与标准基准:
标准输出(截断):
进一步分析,大部分瓶颈似乎都在 unpack64 中。强制大约需要 6ns。unpack64 大约需要 195ns。在这里将 word64 解包为 word8 列表非常昂贵。
haskell - 漂亮的打印字节字符串到十六进制半字节
什么是处理字节串半字节并漂亮地打印其十六进制(0-F)表示的惯用方式?
其中,在进一步的工作中
但我真正想要的是
或者更好
我可以调整 ["1","7e"] 但字符串操作,而我宁愿进行数字操作。我需要下拉到移位和屏蔽数值吗?
haskell - 使用 O(1) 函数为 CString 编写可存储实例以获得总字节长度
我正在尝试为 CString (在我的例子中为空终止的 C 字符)编写一个可存储的向量实例。可存储实例将存储 CString 为 (Ptr CChar) 的指针。因此,向量的长度是 CString 指针的数量。现在,我编写这个可存储实例的原因是因为它将用于从 FFI CString 进行零复制,然后使用 unsafeCreate 快速构建 ByteString(经过一些转换 - 因此,我们在这里使用快速向量进行中间操作)。为了进行快速的 ByteString 构建,可存储实例需要三件事:
- 总长度(以字节为单位) - 可存储实例在将每个 CString 添加到向量时需要进行簿记分配,用于存储每个 CString 的长度,以及到目前为止存储的 CString 的总长度。假设 C 字符串的总长度不能超过 2^31。因此,Int32/Word32 将存储每个 CString 的长度和总长度。
- 存储 CString 及其长度的函数 - O(n) 时间。此函数将遍历 CString,并存储其长度,并将总长度增加 CString 的长度。
- 返回总字节长度的函数 - O(1) 时间。此函数将仅从存储总长度的字段中检索值
虽然我知道如何编写自定义可存储实例,但我不知道如何处理这种情况。一个简单的代码(可以是一个简单的玩具示例),展示如何进行自定义簿记,并编写函数来存储/获取簿记结果将非常感激。
更新 1(澄清)
在我的例子中使用可存储向量实例的原因有两个:使用未装箱类型的快速计算/转换(通过 C FFI 接收的实时数据),以及快速转换为字节串(实时发送数据) IPC 到另一个程序)。对于快速的字节串转换,unsafeCreate 非常好。但是,我们必须知道要分配多少,并且还要传递一个函数进行转换。给定一个可存储的向量实例(具有混合类型 - 我将上面的问题简化为 CString 类型),我很容易构建一个快速转换函数,该函数遍历向量的每个元素并将其转换为字节串。然后,我们简单地将它传递给 unsafeCreate。但是,我们还必须传递要分配的字节数。AO(n) 递归字节长度计算函数太慢,并且可以使构建字节串的开销增加一倍。