作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 char data[len]
从二进制文件中读取的解压缩数据填充的。我知道 data
只能是这些类型:char, uchar, short, ushort, int, uint, float, double
我知道需要的确切位数表示(elesize = {8, 16, 32, 64}
)。
我只想遍历数据列表,比如说,找到 max()
、min()
或给定数字的出现次数。我想在不创建另一个数组来解决内存空间问题的情况下执行此操作。
我想出了以下内容,但它很慢,例如 len == 34560000
所以我想知道是否有人有“单线”或更有效的方法(C 或 C++)。
char data[len];
double mymax = -std::numeric_limits<double>::max()
for (size_t i=0; i<len; i += elesize)
{
double x;
char *r = data+i;
if (elementtype == "char")
x = static_cast<double>(*r);
else if (elementtype == "uchar")
x = static_cast<double>(*((unsigned char *)r));
else if (elementtype == "short")
x = static_cast<double>(*((int16_t *)r));
else if (elementtype == "ushort")
x = static_cast<double>(*((uint16_t *)r));
else if (elementtype == "int")
x = static_cast<double>(*((int32_t *)r));
else if (elementtype == "uint")
x = static_cast<double>(*((uint32_t *)r));
else if (elementtype == "float")
x = static_cast<double>(*((float *)r));
else if (elementtype == "double")
x = *((double *)r);
if (x > mymax)
mymax = x;
}
最佳答案
模板应该做得很好:
#include <algorithm>
template <typename T>
T read_and_advance(const unsigned char * & p)
{
T x;
unsigned char * const px = reinterpret_cast<unsigned char *>(&x);
std::copy(p, p + sizeof(T), px);
P += sizeof(T);
return x;
}
用法:
const unsigned char * p = the_data;
unsigned int max = 0;
while (p != the_data + data_length)
{
max = std::max(max, read_and_advance<unsigned int>(p));
}
废了这个,我原以为是 C 的问题。
这是一个宏:
#define READ_TYPE(T, buf, res) do { memcpy(&res, buf, sizeof(T)); buf += sizeof(T); } while (false)
用法:
int max = 0;
unsigned char * p = data;
while (true)
{
unsigned int res;
READ_TYPE(unsigned int, p, res);
if (res > max) max = res;
}
不过,您并不能真正避免指定类型。在 C++ 中,这可以更优雅地完成。
或者你可以把它全部打包成一个:
#define READ_TYPE_AND_MAX(T, buf, max) \
do { T x; memcpy(&x, buf, sizeof(T)); \
buf += sizeof(T); \
if (max < x) max = x; \
} while (false)
// Usage:
unsigned int max = 0;
unsigned char * p = data;
while (true) { READ_TYPE_AND_MAX(unsigned int, p, max); }
关于c++ - 如何更高效地遍历存储 {int, short, ushort,...} 的字符数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8173307/
我是一名优秀的程序员,十分优秀!