<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss">

<channel>
	<title>Here comes the Sun &#187; c</title>
	<atom:link href="http://sunng.info/blog/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://sunng.info/blog</link>
	<description>Life ramblings</description>
	<lastBuildDate>Thu, 02 Sep 2010 12:29:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Python读取二进制文件</title>
		<link>http://sunng.info/blog/2009/02/python%e8%af%bb%e5%8f%96%e4%ba%8c%e8%bf%9b%e5%88%b6%e6%96%87%e4%bb%b6/</link>
		<comments>http://sunng.info/blog/2009/02/python%e8%af%bb%e5%8f%96%e4%ba%8c%e8%bf%9b%e5%88%b6%e6%96%87%e4%bb%b6/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 10:36:22 +0000</pubDate>
		<dc:creator>Sunng</dc:creator>
				<category><![CDATA[手艺]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.classicning.com/blog/?p=10</guid>
		<description><![CDATA[Python里虽然可以通过&#8217;b'的标记来区别普通文件和二进制文件，但是依然是把二进制文件当作普通文本处理。要读写二进制文件，需要用struct库来作pack和unpack。 比如我最近拿到一个如下数据结构的二进制文件 [codesyntax lang="c" lines="fancy"] struct DEMTYPE { int row; int col; float xmin; float ymin; float xmax; float ymax; float size; float vmin; float vmax; float scale; float *data; }; [/codesyntax] 其中data是一个长度为row*col的数组。要读取这样一个二进制文件，可以用这样的代码 [codesyntax lang="python" lines="fancy"] row, col, xmin, ymin, xmax, ymax, size, vmin, vmax, scale = \ struct.unpack(&#8216;&#60;2i8f&#8217;, datastring[:(4*2+4*8)]) vdata = struct.unpack(&#8216;&#60;&#8217;+str(row*col)+&#8217;f', datastring[(4*2+4*8):]) [/codesyntax] [...]]]></description>
			<content:encoded><![CDATA[<p>Python里虽然可以通过&#8217;b'的标记来区别普通文件和二进制文件，但是依然是把二进制文件当作普通文本处理。要读写二进制文件，需要用struct库来作pack和unpack。</p>
<p>比如我最近拿到一个如下数据结构的二进制文件</p>
<p>[codesyntax lang="c" lines="fancy"]<br />
struct DEMTYPE {<br />
	int row;<br />
	int col;<br />
	float xmin;<br />
	float ymin;<br />
	float xmax;<br />
	float ymax;<br />
	float size;<br />
	float vmin;<br />
	float vmax;<br />
	float scale;<br />
	float *data;<br />
};<br />
[/codesyntax]</p>
<p>其中data是一个长度为row*col的数组。要读取这样一个二进制文件，可以用这样的代码<br />
[codesyntax lang="python" lines="fancy"]<br />
row, col, xmin, ymin, xmax, ymax, size, vmin, vmax, scale = \<br />
        struct.unpack(&#8216;&lt;2i8f&#8217;, datastring[:(4*2+4*8)])<br />
vdata = struct.unpack(&#8216;&lt;&#8217;+str(row*col)+&#8217;f', datastring[(4*2+4*8):])<br />
[/codesyntax]<br />
核心是unpack的第一个参数，用来标识二进制数据的格式，其中&lt;表示little-endian，i表示整型数，f表示单精度浮点数，数字是量词。</p>
<p>更详细的说明可以看manual：<br />
<a href="http://docs.python.org/library/struct.html" target="_blank">http://docs.python.org/library/struct.html</a></p>
<p>好吧，我承认我写这个是来测试highlight插件的。</p>
]]></content:encoded>
			<wfw:commentRss>http://sunng.info/blog/2009/02/python%e8%af%bb%e5%8f%96%e4%ba%8c%e8%bf%9b%e5%88%b6%e6%96%87%e4%bb%b6/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
