gpt4 book ai didi

parsing - 高效地将 Foreign.Ptr Word8(或 ByteString)转换为 UArray Int Word8

转载 作者:行者123 更新时间:2023-12-04 21:31:13 25 4
gpt4 key购买 nike

我正在使用 Network.Pcap 进行一些网络捕获( pcap ) 并计划使用 Net.PacketParsing 进行一些检查( network-house )。为此,看起来我必须将我的数据包解析放入

Pcap.Callback :: PktHdr -> Ptr Word8 -> IO ()

或者
Pcap.CallbackBS :: PktHdr -> ByteString -> IO ().

并将数据包作为“Ptr Word8”或“ByteString”处理。在数据包解析方面,我有:
Net.Packet.toInPack :: UArray Int Word8 -> InPacket

前往 InPacket解析所需的类型。所以,剩下的就是将“Ptr”或“ByteString”转换为“UArray”——无论是纯粹的还是在IO中。我想我可以打开 ByteString[Word8] ,然后从那里到 UArray ,但似乎必须有更好的方法。

我也担心我对图书馆的选择。以前用过network-house,觉得还不错,但是老了,用的是UArray,本身就有点陈旧了。因此,欢迎提供更好的起点的建议。

最佳答案

ByteStringPtr Word8指向外部堆,而 UArray位于 GHC 堆上,因此任何转换函数都必须复制数据。

我在库中没有找到任何直接转换函数,但幸运的是有一个 GHC 原语,它完全符合我们的要求,叫做 copyAddrToByteArray# .这让我们能够以最小的开销进行转换:

{-# language MagicHash, UnboxedTuples #-}

import qualified Data.ByteString as B
import qualified Data.ByteString.Internal as B
import qualified Data.Array.Base as A

import GHC.Types
import GHC.Prim
import GHC.Magic (runRW#)
import GHC.ForeignPtr
import Data.Word

-- when using GHC 8.2.x or later:
byteStringToUArray :: B.ByteString -> A.UArray Int Word8
byteStringToUArray (B.PS (ForeignPtr addr _) (I# start) (I# len)) =
runRW# $ \s -> case newByteArray# len s of
(# s, marr #) -> case copyAddrToByteArray# (plusAddr# addr start) marr 0# len s of
s -> case unsafeFreezeByteArray# marr s of
(# _, arr #) -> A.UArray 0 (I# (len -# 1#)) (I# len) arr
{-# inline byteStringToUArray #-}

-- when using GHC 8.0.x:
byteStringToUArray :: B.ByteString -> A.UArray Int Word8
byteStringToUArray (B.PS (ForeignPtr addr _) (I# start) (I# len)) =
case (runRW# $ \s -> case newByteArray# len s of
(# s, marr #) -> case copyAddrToByteArray# (plusAddr# addr start) marr 0# len s of
s -> case unsafeFreezeByteArray# marr s of
(# s, arr #) -> (# s, A.UArray 0 (I# (len -# 1#)) (I# len) arr #)) of
(# _, res #) -> res
{-# inline byteStringToUArray #-}

但总的来说,您是对的 array已经过时,现在很少使用。

关于parsing - 高效地将 Foreign.Ptr Word8(或 ByteString)转换为 UArray Int Word8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50821578/

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