gpt4 book ai didi

c++ - 从具有 bigendian 格式的 QByteArray 获取 float 组的有效方法

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:39 25 4
gpt4 key购买 nike

我有一个 BigEndian 格式的 QbyteArray 变量我想用最少的过程从该变量中获取一个 float 组。最快的方法是什么?

现在我正在使用以下代码,但效率不高,我认为应该有更好的方法吗?

请帮忙

float getValue(QByteArray dataBytes, int i){    
QByteArray data = dataBytes.mid(i*4, 4);
qint32 level = qFromBigEndian<qint32>((uchar*)data.data());
float result = level*1.0;
}

float *f = new float[20];
for (int i=0;i<20;i++){
f[i] = getValue(myDataBytes, i);
}

最佳答案

为什么不制作一个迭代器并构建一个std::vector?没有效率损失加上完全安全:

#include <cstdint>
#include <algorithm>
#include <vector>
#include <iterator>

// simulate types
using qint32 = std::int32_t;

struct QByteArray {
QByteArray mid(int, int);
const std::uint8_t* data() const;
const std::size_t* size() const;
};

// simulate functions
template<class T> T qFromBigEndian(const std::uint8_t*);

// iterator to convert big endian byte streams to ints
struct big_endian_ints_iterator
: std::iterator<std::forward_iterator_tag, std::int32_t>
{

big_endian_ints_iterator(const std::uint8_t * p) : ptr_(p) {}

big_endian_ints_iterator& operator+=(std::size_t i) {
ptr_ += 4 * i;
return *this;
}

big_endian_ints_iterator& operator++() {
ptr_ += 4;
return *this;
}

big_endian_ints_iterator operator++(int) {
auto tmp = *this;
ptr_ += 4;
return tmp;
}

value_type operator*() const {
return qFromBigEndian<std::int32_t>(ptr_);
}

bool operator!=(const big_endian_ints_iterator& r) const {
return r.ptr_ != ptr_;
}

bool operator==(const big_endian_ints_iterator& r) const {
return r.ptr_ == ptr_;
}

const std::uint8_t* ptr_;
};

big_endian_ints_iterator operator+(big_endian_ints_iterator l, std::size_t r)
{
return l += r;
}

std::vector<float> test(QByteArray const& myDataBytes)
{
auto first = big_endian_ints_iterator(myDataBytes.data());
std::vector<float> f(first, first + 20);
return f;
}

godbolt 证明:https://godbolt.org/g/PG3H2V

关于c++ - 从具有 bigendian 格式的 QByteArray 获取 float 组的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41632024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com