XNSim/Release/include/XNCore/XNByteArray.h

164 lines
3.5 KiB
C
Raw Normal View History

#pragma once
#include <vector>
#include <cstdint>
#include <cstring>
/**
* @brief
* @details QByteArray的功能
*/
class XNByteArray
{
public:
XNByteArray() = default;
explicit XNByteArray(size_t size) : data_(size) {}
/**
* @brief
* @param buffer
* @param size
*/
XNByteArray(const uint8_t *buffer, size_t size) : data_(buffer, buffer + size) {}
/**
* @brief
* @return
*/
uint8_t *data() { return data_.data(); }
/**
* @brief
* @return
*/
const uint8_t *data() const { return data_.data(); }
/**
* @brief
* @return
*/
size_t size() const { return data_.size(); }
/**
* @brief
* @param size
*/
void resize(size_t size) { data_.resize(size); }
/**
* @brief
*/
void clear() { data_.clear(); }
/**
* @brief
* @param buffer
* @param size
*/
void append(const uint8_t *buffer, size_t size)
{
size_t oldSize = data_.size();
data_.resize(oldSize + size);
std::memcpy(data_.data() + oldSize, buffer, size);
}
/**
* @brief XNByteArray
* @param other XNByteArray
*/
void append(const XNByteArray &other) { append(other.data(), other.size()); }
/**
* @brief
* @param index
* @return
*/
uint8_t &operator[](size_t index) { return data_[index]; }
/**
* @brief
* @param index
* @return
*/
const uint8_t &operator[](size_t index) const { return data_[index]; }
/**
* @brief
* @return
*/
bool isEmpty() const { return data_.empty(); }
/**
* @brief
* @param size
*/
void reserve(size_t size) { data_.reserve(size); }
/**
* @brief
* @param segmentSize
* @return XNByteArray向量
*/
std::vector<XNByteArray> segment(size_t segmentSize) const
{
if (segmentSize == 0) {
return {};
}
size_t totalSize = data_.size();
// 检查是否能够整除
if (totalSize % segmentSize != 0) {
return {};
}
std::vector<XNByteArray> segments;
size_t numSegments = totalSize / segmentSize;
segments.reserve(numSegments);
for (size_t i = 0; i < totalSize; i += segmentSize) {
segments.emplace_back(data_.data() + i, segmentSize);
}
return segments;
}
/**
* @brief
* @param start
* @param length
* @return
*/
XNByteArray mid(size_t start, size_t length = SIZE_MAX) const
{
if (start >= data_.size()) {
return XNByteArray{};
}
size_t actualLength = std::min(length, data_.size() - start);
return XNByteArray(data_.data() + start, actualLength);
}
/**
* @brief
* @param length
* @return
*/
XNByteArray left(size_t length) const { return mid(0, length); }
/**
* @brief
* @param length
* @return
*/
XNByteArray right(size_t length) const
{
if (length >= data_.size()) {
return *this;
}
return mid(data_.size() - length, length);
}
private:
std::vector<uint8_t> data_;
};