2014-03-19 6 views
4

ByteString으로 Data.Vector.Storable의 벡터를 어떻게 변환 할 수 있는지 궁금합니다. 나는 꽤 명백한 무언가를 놓치고 있다고 생각합니다.벡터를 Haskell의 ByteString으로 변환

Network.Socket.ByteString을 사용하여 네트워크를 통해 보내려고하므로 ByteString으로 변환해야합니다. 가장 효율적인 데이터 구조 인 것 같습니다.

어떻게 기능을

writeToByteString :: Vector Int -> ByteString 
writeToByteString v = 

많은 감사를 작성하는 코드를 작성할 수 있습니다.

+0

음, 어떻게'Int'에'Word8'을 변환 할 수 있습니까? 'Int'는 특정 플랫폼이므로, 이것은 정말로 까다로운 부분입니다. 그 후에 그것은'BS.pack '처럼 간단 할 수 있습니다. V.toList' (가장 효율적인 방법은 아닐지라도)입니다. – bheklilr

답변

2

실제로 달성하고자하는 것에 따라 다릅니다. bheklilr 언급 한 바와 같이 Int 표현은 플랫폼에 따라 다릅니다.

그러나 두포 아래의 저장 가능한 벡터는 메모리 조각입니다. 콘텐츠를 가져 오려면 unsafeToForeignPtr0을 사용하십시오. 다음은 그 예이다 :

import qualified Data.Vector.Storable as V 
import qualified Data.ByteString as BS 

import Foreign 

main :: IO() 
main = do 
    let v = V.generate 10 id :: V.Vector Int 
     (fptr, len) = V.unsafeToForeignPtr0 v 
    print v 
    bs <- withForeignPtr fptr $ \ptr -> 
    BS.packCStringLen (castPtr ptr, len * sizeOf (undefined :: Int)) 
    print $ BS.unpack bs 

출력하십시오`ByteString`가 Word8`s '로 구성되어있다

fromList [0,1,2,3,4,5,6,7,8,9] 
[0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0] 
+0

대단히 고마워,이게 내가 원한거야. Int를 예제로 사용했지만 몇 가지 C 기반 유형을 지원해야 할 수도 있습니다. – user3199023

관련 문제