Hi Haskell Cafe,<br><br>I&#39;m trying to send stuff over UDP.  To do that, I&#39;ve written a test program that sends strings across.  That was fine, but I wanted to send binary data too.  So I tried that only to find I am having difficulty putting together some binary data.  For examples take the fromHex function in the following code.<br>
It is supposed to convert from a Hexadecimal string to a list of bytes, but I am having trouble coercing the integer types to the size I want.<br><br>Is this the right way to do it?<br><br>Cheers,<br><br>-John<br><br>&gt;  import Data.Bits<br>
&gt;  import Data.Char<br>&gt;  import Data.Word<br>&gt;  import System.Environment<br>&gt;  import XStream.Tsmr.Client<br><br>&gt;  data CmdLineOptions = CmdLineOptions<br>&gt;     { optionHelp :: Bool<br>&gt;     , optionVersion :: Bool<br>
&gt;     , optionPort :: String<br>&gt;     , optionMessage :: String<br>&gt;     , optionInvalids :: [String]<br>&gt;     }<br>&gt;     deriving (Eq, Show)<br><br>&gt;  initCmdLineOptions = CmdLineOptions<br>&gt;     { optionHelp = False<br>
&gt;     , optionVersion = False<br>&gt;     , optionPort = &quot;1234&quot;<br>&gt;     , optionMessage = &quot;&quot;<br>&gt;     }<br><br>&gt;  parseArgs :: [String] -&gt; CmdLineOptions<br>&gt;  parseArgs [] = initCmdLineOptions <br>
&gt;  parseArgs (&quot;--port&quot;:port:xs) = (parseArgs xs) { optionPort = port }<br>&gt;  parseArgs (&quot;--help&quot;:xs) = (parseArgs xs) { optionHelp = True }<br>&gt;  parseArgs (&quot;--version&quot;:xs) = (parseArgs xs) { optionVersion = True }<br>
&gt;  parseArgs ((&#39;-&#39;:opt):xs) = let option = (parseArgs xs) in<br>&gt;     option { optionInvalids = (&#39;-&#39;:opt):optionInvalids option }<br>&gt;  parseArgs (message:xs) = (parseArgs xs) { optionMessage = message }<br>
<br>&gt;  printUsage = do<br>&gt;     putStrLn &quot;Usage: udp-server.lhs [options] &lt;message&gt;&quot;<br>&gt;     putStrLn &quot;&quot;<br>&gt;     putStrLn &quot;Options:&quot;<br>&gt;     putStrLn &quot;  --help      Get help information.&quot;<br>
&gt;     putStrLn &quot;  --vesion    Get version information.&quot;<br>&gt;     putStrLn &quot;  --port n    The port number to listen on.&quot;<br>&gt;     putStrLn &quot;&quot;<br>&gt;     putStrLn &quot;Message:&quot;<br>
&gt;     putStrLn &quot;  The message to send.&quot;<br>&gt;     putStrLn &quot;&quot;<br><br>&gt;  printVersion = do<br>&gt;     putStrLn &quot;Version.&quot;<br><br>&gt;  fromHex :: String -&gt; [Word8]<br>&gt;  fromHex [] = []<br>
&gt;  fromHex (u:l:xs) = (hexU .|. hexL):fromHex xs<br>&gt;     where<br>&gt;        hexU = (fromInteger $ hexValue u) :: Word8<br>&gt;        hexL = (fromInteger $ hexValue l) :: Int<br>&gt;        hexValue c<br>&gt;           | &#39;0&#39; &lt;= c &amp;&amp; c &lt;= &#39;9&#39; = ord c - ord &#39;0&#39;<br>
&gt;           | &#39;a&#39; &lt;= c &amp;&amp; c &lt;= &#39;z&#39; = ord c - ord &#39;a&#39; + 10<br><br><br>&gt;  run port message = do<br>&gt;     h &lt;- openlog &quot;localhost&quot; port &quot;udp-client.lhs&quot;<br>
&gt;     syslog h (fromHex message)<br><br>&gt;  main = do<br>&gt;     args &lt;- getArgs<br>&gt;     let options = parseArgs args<br>&gt;     let port = optionPort options<br>&gt;     let message = optionMessage options<br>
&gt;     if optionHelp options<br>&gt;        then printUsage<br>&gt;        else if optionVersion options<br>&gt;           then printVersion<br>&gt;           else do<br>&gt;              putStrLn (&quot;Starting UDP listener on port: &quot; ++ port)<br>
&gt;              run port message<br><br><br><br><br><br>