<div dir="ltr">Li,<div><br></div><div>The best solution would be for NCL to support mixed data types in binary files, like C and fortran.  But that support is complicated, and not currently available.</div><div><br>
</div><div>I think that it is dangerous to perform direct type conversions from byte strings in a user program, if it can possibly be avoided.</div><div><br></div><div>The NCL function &quot;fbindirread&quot; reads a binary file as if it is a continuous array of a single data type.  You can use this ability to read mixed types directly from the file, as long as the data are aligned correctly.  This example will read your header values correctly:</div>


<div><br></div><div><div>   rec_num    = 0</div><div>   n_elements = 10</div><div><br></div><div>   head_int = fbindirread (&quot;test.bin&quot;, rec_num, n_elements, &quot;integer&quot;)</div><div>   b = head_int(4:5)</div>


<div>   print (&quot;b = &quot; + b)</div><div><br></div><div>   head_float = fbindirread (&quot;test.bin&quot;, rec_num, n_elements, &quot;float&quot;)</div><div>   c = head_float(6:9)</div><div>   print (&quot;c = &quot; + c)</div>


</div><div><br></div><div>Note that the header is read more than once.  This is necessary when reading mixed types by this method.</div><div><br></div><div>Note also that each integer and each float is 4 bytes long.  To skip over the 16 characters at the start of the header, you must skip over only 4 elements in an integer or float array, *not* 16 elements.</div>


<div><br></div><div>You are lucky that the authors of this file decided to make the character string an even multiple of 4.  Otherwise the integers and floats would be misaligned.  You could still read such a file with NCL, but it would require more tricks and get messier.  HTH.</div>

<div><br></div><div>--Dave</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Aug 14, 2014 at 12:36 AM, Li Dong <span dir="ltr">&lt;<a href="mailto:dongli@lasg.iap.ac.cn" target="_blank">dongli@lasg.iap.ac.cn</a>&gt;</span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word">Dear all,<div><br></div>


<div>When I read a binary file, which contains a head, I first need to get some information from the head. The head contains several variables in different types, such as in Fortran:</div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">


<div>type head</div><div>    character(16) a</div><div>    integer(2) b</div><div>    real(4) c</div><div>end head</div></blockquote><div><br></div><div>The binary file is written in C format (I think, it is from other guys). I tried to use `cbinread` to read the head as:</div>


<div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>head = cbinread(“…”, 22, “character”)</div></blockquote><div><br></div><div>So now I get an array of characters. The character string `a` can be easily extracted as:</div>


<div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>a = charactertostring(head(0:15))</div></blockquote><div><br></div><div>But what about `b` and `c`? How do I get them from head(16:17) and head(18:21)? I didn’t find some functions that can take several bytes and combine them to form other desired types.</div>


<div><br></div><div>Thanks in advance!</div><div><br></div><div>Best regards,</div><div><br></div><div>Li</div></div></blockquote></div><br></div></div>