<P>用C++做同样的事情,你会用不同的参数声明^ {< CD1>}:</P>
<pre><code>struct DeviceRecord {
uint32_t masterId;
uint16_t period, skipfactor, _a, _b;
uint32_t _c;
char date[8];
char time[8];
char padding[64];
uint16_t num;
uint32_t deviceID;
uint16_t length, mode;
uint32_t settings;
char padding[8];
};
</code></pre>
<p>(这个结构可能已经在某个地方声明了;它也可能使用“unsigned int”代替“uint32”和“unsigned short”来代替“uint16”,而“u a”、“u b”和“u c”可能有实名。)</p>
<p>一旦有了结构,问题是如何获取数据。这取决于数据在哪里。如果它在一个文件中,你应该这样做:</p>
^{pr2}$
<p>另一方面,如果它在内存中的某个地方(例如,你有一个char*或void*),那么你只需要将它转换为:</p>
<pre><code>void* data_source = get_data(...); // You'd get this from somewhere
DeviceRecord* rec_ptr = reinterpret_cast<DeviceRecord*>(stat_source);
// Now you can access rec_ptr->masterID etc
</code></pre>
<p>如果您有一个<code>std::vector</code>,您可以很容易地得到这样一个指针:</p>
<pre><code>std::vector<uint8_t> data_source = get_data(...); // As above
DeviceRecord* rec_ptr = reinterpret_cast<DeviceRecord*>(data_source.data());
// Now you can access rec_ptr->masterID etc, provided data_source remains in scope. You should probably also avoid modifying data_source.
</code></pre>
<p>这里还有一个问题。你收到的数据是用big-endian格式的,但是除非你有一个PowerPC或其他不寻常的处理器,否则你可能在一个小endian机器上。所以在访问数据之前,您需要进行一些字节交换。您可以使用以下函数来执行此操作。在</p>
<pre><code>template<typename Int>
Int swap_int(Int n) {
if(sizeof(Int) == 2) {
union {char c[2]; Int i;} swapper;
swapper.i = n;
std::swap(swapper.c[0], swapper.c[1]);
n = swapper.i;
} else if(sizeof(Int) == 4) {
union {char c[4]; Int i;} swapper;
swapper.i = n;
std::swap(swapper.c[0], swapper.c[3]);
std::swap(swapper.c[1], swapper.c[2]);
n = swapper.i;
}
return n;
}
</code></pre>
<p>它们返回交换的值,而不是就地更改它,所以现在您可以使用<code>swap_int(rec->num)</code>之类的东西访问数据。注意:上面的字节交换代码未经测试;稍后我将尝试编译它,如果需要的话进行修复。在</p>
<p>如果没有更多的信息,我不能给你一个明确的方法来做这件事,但也许这将足以帮助你自己解决它。在</p>