gpt4 book ai didi

haskell - 用户损坏、Data.Binary 损坏或安装损坏?

转载 作者:行者123 更新时间:2023-12-02 14:40:51 27 4
gpt4 key购买 nike

我尝试使用 Data.Binary 序列化 Map,但出现错误:字节不足。然后,我尝试使用整数列表制作一个更简单的示例,但在这里,这也不起作用。可能出了什么问题?我的代码是否有错误、我误解了什么,或者我的安装是否有问题,在这种情况下我该如何解决?

下面是我的测试代码...

import Data.Binary

worldfile = "binarysimple.world"
main = do
ser <- decodeFileOrFail worldfile
case ser of
Right w -> showWorld $ show (w :: [Int])
Left (_,s) -> putStrLn ("the error:"++s) >> newworld

newworld = do
let world = [1,2,3] :: [Int]
showWorld $ show world
encodeFile worldfile $ encode world

showWorld = putStrLn

...以及运行时的输出:

ghci binarysimple.hs
GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main ( binarysimple.hs, interpreted )
Ok, modules loaded: Main.
*Main> main
Loading package array-0.4.0.1 ... linking ... done.
Loading package deepseq-1.3.0.1 ... linking ... done.
Loading package containers-0.5.0.0 ... linking ... done.
Loading package bytestring-0.10.0.2 ... linking ... done.
Loading package binary-0.7.1.0 ... linking ... done.
the error:demandInput: not enough bytes
[1,2,3]
*Main> newworld
[1,2,3]
*Main> main
the error:demandInput: not enough bytes
[1,2,3]
*Main> newworld
[1,2,3]
*Main>
Leaving GHCi.
$ ls -l binarysimple.world
-rw-r--r-- 1 btobias staff 40 8 Sep 21:15 binarysimple.world

我不知道确切的格式,但这可能是合理的输出:

$ hexdump -C binarysimple.world
00000000 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 03 |....... ........|
00000010 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 02 |................|
00000020 00 00 00 00 00 00 00 03 |........|
00000028

最佳答案

问题

让我们回顾一下您认为自己在做什么以及正在做什么。

您认为您正在使用binaryInt 列表进行编码并将该字节字符串写入文件中。然后,您从文件中读取并解码 Int 列表,结果却失败了。

您实际上所做的是将 Int 列表编码为字节串,然后将该字节串编码为字节串(因此,在字节前面添加了一个额外的长度字段)并将该字节串写入磁盘。然后您的解码就会失败,因为磁盘上有 encode(encode(list)) 而不是 encode(list)

解决方案

只需更改行读数:

encodeFile worldfile $ encode world

encodeFile worldfile world

读取十六进制转储

00000000  00 00 00 00 00 00 00 20  00 00 00 00 00 00 00 03  |....... ........|
00000010 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 02 |................|
00000020 00 00 00 00 00 00 00 03

因此,上面的十六进制转储可以读取为一系列 64 位整数:0x20, 3, 1, 2, 3。第一个值,十进制 32,是 Bytestring 编码的一部分,表示剩余字节串的长度(8 个字节 * 4 个整数)。第二个值 3 是列表编码的一部分 - 它指示列表的长度。最终值是列表中的各个元素。

最后,你不需要网上随机的人向你解释格式,你可以从 binary 包中的实例中读取格式(一旦你足够熟悉 Haskell) .

关于haskell - 用户损坏、Data.Binary 损坏或安装损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18687816/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com