Skip to content

Instantly share code, notes, and snippets.

@EarlGray
Created August 16, 2015 11:53
Show Gist options
  • Save EarlGray/28b77746289ea7b8eb63 to your computer and use it in GitHub Desktop.
Save EarlGray/28b77746289ea7b8eb63 to your computer and use it in GitHub Desktop.
deembed: hs|erl
-module(deembed).
-export([main/1]).
read_bins(Data, 0) -> Data;
read_bins(<<NameSize, Name:NameSize/binary,
DataSize:32, _BinData:DataSize/binary,
Rest/binary>>, N) when N > 0 ->
io:format(" ~p (~p bytes)\n", [binary_to_list(Name), DataSize]),
read_bins(Rest, N - 1).
read_buck(<<>>) -> [];
read_buck(<<BuckNameSize, Data1/binary>>) ->
<<BuckName:BuckNameSize/binary, BuckBinCount:32, Rest/binary>> = Data1,
io:format("BuckBinCount = ~p, BuckName = ~p\n",
[BuckBinCount, binary_to_list(BuckName)]),
read_bins(Rest, BuckBinCount).
main([FileName]) ->
{ok, <<BuckCount:32, BinCount:32, Data/binary>>} = file:read_file(FileName),
io:format("BuckCount = ~p, BinCount = ~p\n", [BuckCount, BinCount]),
lists:foldl(fun (_, D) -> read_buck(D) end, Data, lists:seq(1, BuckCount)),
ok.
import Control.Monad
import Data.Binary.Get
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.UTF8 as BU
import System.Environment (getArgs)
readBin = do
name <- getByteString =<< fromIntegral `fmap` getWord8
datasize <- getWord32be
skip (fromIntegral datasize)
return (name, datasize)
readBuck = do
buckName <- getByteString =<< fromIntegral `fmap` getWord8
buckBinCount <- getWord32be
bins <- replicateM (fromIntegral buckBinCount) readBin
return (buckName, bins)
readEmbedfs = runGet $ do
[buckCount, binCount] <- replicateM 2 getWord32be
bucks <- replicateM (fromIntegral buckCount) readBuck
return (buckCount, binCount, bucks)
main = do
[filename] <- getArgs
(buckCount, binCount, bucks) <- readEmbedfs `fmap` BL.readFile filename
forM_ bucks $ \(buckname, bins) -> do
putStrLn $ "Buck: " ++ BU.toString buckname ++ " (" ++ show (length bins) ++ " bins)"
forM_ bins (\(bin, binlen) ->
putStrLn $ " " ++ BU.toString bin ++ " (" ++ show binlen ++ " bytes)")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment