用C++实现Java的ByteArray类(字节数组)

news/2024/12/5 12:14:26/

最近由于项目原因,需要将Java项目中的ByteArray类用C++实现一遍,于是琢磨了一下,下面是该类中部分已实现方法的使用说明:

    // 添加一个字节到ByteArray中。
    void addByte(uint8_t byte);

    // 添加多个字节到ByteArray中
    void addBytes(const std::vector<uint8_t>& bytes) 

    // 获取指定索引位置的字节。
    uint8_t getByte(int index) const;

    // 设置指定索引位置的字节值。
    void setByte(int index, uint8_t value);

    //获取所有字节
    std::vector<uint8_t> getBytes();

    // 获取ByteArray的长度(字节数)。
    int length() const;

    // 从字节字符串创建一个ByteArray对象。
    static ByteArray fromByteString(const std::string& byteString);

    // 将ByteArray转换为二进制字符串。
    std::string toBinaryString() const;

    // 从二进制字符串创建一个ByteArray对象。
    static ByteArray fromBinaryString(const std::string& binaryString);

    // 从长整型值创建一个ByteArray对象。
    static ByteArray fromLongValue(uint64_t value);

    // 将ByteArray转换为ASCII字符串。
    std::string toASCII() const;

    // 从ByteArray中提取指定位范围的子字节字段。
    ByteArray subByteField(int startBit, int numBits) const;

    // 反转ByteArray中的字节顺序。
    void reverse();

下面几个是计划添加但还没实现的函数:

    // 获取ByteArray的字节数据。
    const std::vector<uint8_t>& getData() const;

    // 根据索引获取ByteArray的字节数据。
    uint8_t operator[](int index) const;

    // 根据索引设置ByteArray的字节数据。
    uint8_t& operator[](int index);

    // 比较两个ByteArray是否相等。
    bool operator==(const ByteArray& other) const;

    // 比较两个ByteArray是否不相等。
    bool operator!=(const ByteArray& other) const;

下面是完整的实现代码:


#include "stdafx.h"#include <iostream>
#include <vector>
#include <stdexcept>
#include <sstream>
#include <iomanip>class ByteArray {
private:std::vector<uint8_t> data;public:ByteArray() {}ByteArray(const std::vector<uint8_t>& bytes) : data(bytes) {}void addByte(uint8_t byte) {data.push_back(byte);}void addBytes(const std::vector<uint8_t>& bytes) {data.insert(data.end(), bytes.begin(), bytes.end());}uint8_t getByte(int index) {if (index < 0 || index >= data.size()) {throw std::out_of_range("Index out of range");}return data[index];}void setByte(int index, uint8_t byte) {if (index < 0 || index >= data.size()) {throw std::out_of_range("Index out of range");}data[index] = byte;}int length() {return data.size();}std::vector<uint8_t> getBytes() {return data;}std::string toString() {std::string result(data.begin(), data.end());return result;}bool equals(const ByteArray& other) {if (data.size() != other.data.size()) {return false;}for (int i = 0; i < data.size(); i++) {if (data[i] != other.data[i]) {return false;}}return true;}static ByteArray fromByteString(const std::string& byteString) {std::vector<uint8_t> bytes;std::istringstream iss(byteString);std::string byte;while (iss >> std::setw(2) >> byte) {uint8_t value = std::stoi(byte, nullptr, 16);bytes.push_back(value);}return ByteArray(bytes);}static ByteArray fromBinaryString(const std::string& binaryString) {std::vector<uint8_t> bytes;std::string byte;for (int i = 0; i < binaryString.length(); i += 8) {byte = binaryString.substr(i, 8);uint8_t value = std::stoi(byte, nullptr, 2);bytes.push_back(value);}return ByteArray(bytes);}static ByteArray fromLongValue(uint64_t value) {std::vector<uint8_t> bytes(sizeof(value));for (int i = sizeof(value) - 1; i >= 0; i--) {bytes[i] = value & 0xFF;value >>= 8;}return ByteArray(bytes);}uint8_t get(int index) {return getByte(index);}void insertBits(int index, uint8_t value, int numBits) {if (index < 0 || index > length() || numBits < 0 || numBits > 8) {throw std::out_of_range("Index or number of bits out of range");}uint8_t currentByte = getByte(index);// Shift existing bits to the leftcurrentByte <<= numBits;// Clear the space for new bitsuint8_t mask = ~(0xFF << numBits);currentByte &= mask;// Insert the new bitsvalue &= mask;currentByte |= value;setByte(index, currentByte);}uint8_t getBit(int index, int bitPosition) {if (index < 0 || index >= length() || bitPosition < 0 || bitPosition > 7) {throw std::out_of_range("Index or bit position out of range");}uint8_t currentByte = getByte(index);return (currentByte >> bitPosition) & 0x01;}std::string ByteArray::toByteString() {std::stringstream ss;ss << std::hex << std::setfill('0');for (int i = 0; i < length(); i++) {ss << std::setw(2) << static_cast<int>(data[i]) << " ";}std::string byteString = ss.str();// Remove trailing spacebyteString.pop_back();return byteString;}int size() {return length() * 8;}std::string toBinaryString() {std::stringstream ss;for (int i = 0; i < length(); i++) {uint8_t currentByte = getByte(i);for (int j = 7; j >= 0; j--) {ss << ((currentByte >> j) & 0x01);}}return ss.str();}uint64_t toLongValue() {if (length() > sizeof(uint64_t)) {throw std::out_of_range("ByteArray size too large for uint64_t conversion");}uint64_t value = 0;for (int i = 0; i < length(); i++) {value <<= 8;value |= getByte(i);}return value;}std::string toASCII() {std::string result = "";for (int i = 0; i < length(); i++) {char character = static_cast<char>(getByte(i));result += character;}return result;}ByteArray ByteArray::subByteField(int startBit, int numBits) {if (startBit < 0 || startBit >= size() || numBits < 1 || numBits > size() - startBit) {throw std::out_of_range("Invalid start bit or number of bits");}int startByte = startBit / 8;int startBitIndex = startBit % 8;int endBit = startBit + numBits - 1;int endByte = endBit / 8;int endBitIndex = endBit % 8;std::vector<uint8_t> subBytes;if (startByte == endByte) {uint8_t startByteValue = getByte(startByte);uint8_t mask = static_cast<uint8_t>((1 << numBits) - 1);uint8_t subByteValue = (startByteValue >> (8 - startBitIndex - numBits)) & mask;subBytes.push_back(subByteValue);}else {uint8_t startByteValue = getByte(startByte);uint8_t mask = static_cast<uint8_t>((1 << (8 - startBitIndex)) - 1);uint8_t subByteValue = (startByteValue >> (8 - startBitIndex)) & mask;subBytes.push_back(subByteValue);for (int i = startByte + 1; i < endByte; i++) {uint8_t byteValue = getByte(i);subBytes.push_back(byteValue);}uint8_t endByteValue = getByte(endByte);uint8_t mask2 = static_cast<uint8_t>((1 << (endBitIndex + 1)) - 1);uint8_t subByteValue2 = (endByteValue >> (8 - endBitIndex - 1)) & mask2;subBytes.push_back(subByteValue2);}return ByteArray(subBytes);}void reverse() {std::reverse(data.begin(), data.end());}void set(int index, uint8_t value) {setByte(index, value);}void setBit(int index, int bitPosition, uint8_t bitValue) {if (index < 0 || index >= length() || bitPosition < 0 || bitPosition > 7 || (bitValue != 0 && bitValue != 1)) {throw std::out_of_range("Index, bit position, or bit value out of range");}uint8_t currentByte = getByte(index);uint8_t mask = ~(0x01 << bitPosition);currentByte &= mask;currentByte |= (bitValue << bitPosition);setByte(index, currentByte);}
};

下面是使用示例:

int main() {ByteArray byteArray;byteArray.addByte(0x55);byteArray.addByte(0xAA);byteArray.addByte(0xFF);std::cout << "ByteArray as hex string: " << byteArray.toString() << std::endl;std::string byteString = byteArray.toByteString();std::cout << "ByteArray as byte string: " << byteString << std::endl;ByteArray byteArrayFromByteString = ByteArray::fromByteString(byteString);std::cout << "ByteArray from byte string: " << byteArrayFromByteString.toString() << std::endl;std::string binaryString = byteArray.toBinaryString();std::cout << "ByteArray as binary string: " << binaryString << std::endl;ByteArray byteArrayFromBinaryString = ByteArray::fromBinaryString(binaryString);std::cout << "ByteArray from binary string: " << byteArrayFromBinaryString.toString() << std::endl;uint64_t longValue = 0xFFAA55;ByteArray byteArrayFromLongValue = ByteArray::fromLongValue(longValue);std::cout << "ByteArray from long value: " << byteArrayFromLongValue.toString() << std::endl;std::string asciiString = byteArray.toASCII();std::cout << "ByteArray as ASCII string: " << asciiString << std::endl;std::cout << "ByteArray size: " << byteArray.length() << std::endl;ByteArray subBytes = byteArray.subByteField(4, 12);std::cout << "Sub-byte field: " << subBytes.toString() << std::endl;byteArray.reverse();std::cout << "Reversed ByteArray: " << byteArray.toString() << std::endl;byteArray.setByte(1, 0xBB);std::cout << "Updated ByteArray: " << byteArray.toString() << std::endl;byteArray.setBit(0, 2, 1);std::cout << "Updated ByteArray: " << byteArray.toString() << std::endl;return 0;
}

在主函数中,我们创建了一个 ByteArray 对象并执行了以下操作:

  • 向 ByteArray 对象中添加字节
  • 将 ByteArray 对象转换为十六进制字符串并输出
  • 将 ByteArray 对象转换为字节字符串并输出
  • 使用 fromByteString 方法将字节字符串转换回 ByteArray 对象并输出
  • 将 ByteArray 对象转换为二进制字符串并输出
  • 使用 fromBinaryString 方法将二进制字符串转换回 ByteArray 对象并输出
  • 使用 fromLongValue 方法将长整型值转换为 ByteArray 对象并输出
  • 将 ByteArray 对象转换为 ASCII 字符串并输出
  • 获取 ByteArray 对象的长度并输出
  • 从 ByteArray 对象中提取子字节字段并输出
  • 反转 ByteArray 对象的字节反序并输出
  • 更新 ByteArray 对象的字节值并输出
  • 更新 ByteArray 对象的特定位的值并输出

下面是执行结果: 

 


http://www.ppmy.cn/news/908597.html

相关文章

[橘汁仙剑网出品]仙剑奇侠传六全剧情视频动画配音版[1080P][720P][H264]

转载自橘汁仙剑网&#xff08;http://www.ojpal.com/article-856-1.html&#xff09; 全剧情1080P版本下载地址 百度网盘下载&#xff1a; 专辑分享&#xff1a; http://yun.baidu.com/pcloud/album/info?uk688129892&album_id6526257817887254126 公开链接&#xff1…

Woderwate-Intouch驱动(包括施耐德,西门子,AB等的DASever、IOServer)

1、Wonderware DeviceIntegration2014R2 SP1 百度网盘链接&#xff1a;https://pan.baidu.com/s/1aCBWAVpnXA0SLUSRWYsl0w 提取码&#xff1a;cyjn 2、Device Integration 百度网盘链接&#xff1a;https://pan.baidu.com/s/1k7bY0RFQotCF_KgM9FWYpQ 提取码&#xff1a;27e9…

黑苹果安装参考

http://www.cnblogs.com/zouzf/p/4356641.htmlhttp://bbs.pcbeta.com/viewthread-1581554-1-1.htmlhttp://tieba.baidu.com/p/2049965360http://bbs.pcbeta.com/forum.php?modforumdisplay&fid498http://osx86.cn/category/drive/安装置顶帖http://bbs.pcbeta.com/viewthr…

新增Tao插件,Red Giant 经典特效插件 Trapcode Suite 13 for Win/Mac

【插件介绍】 请注意&#xff1a;该插件仅支持Win&Mac平台下的Adobe After Effects CC 2015, 2014, CC, CS6, CS5.5, CS5&#xff0c;以及Adobe Premiere Pro CC 2015, 2014, CC, CS6, CS5.5, CS5&#xff08;部分插件支持&#xff09;&#xff0c;下载前敬请留意。 行业必…

如何使用ArcGIS Pro进行洪水淹没分析

伴随Esri将重心越来越多的放在ArcGIS Pro上,以后ArcGIS的使用场景可能会越来越少,所以我们可以提前接触并使用ArcGIS Pro,做好相关准备。这里为大家介绍一下在ArcGIS中常见的操作——洪水淹没分析在ArcGIS Pro中如何实现。 01 加载数据 在菜单栏上点击插入,点击新建地图,…

Python垃圾回收

Python垃圾回收 文章目录 Python垃圾回收引用计数标记清除分代回收 GC作为现代编程语言的自动内存管理机制&#xff0c;专注于两件事&#xff1a; 找到内存中无用的垃圾资源清除这些垃圾并把内存让出来给其他对象使用。 GC彻底把程序员从资源管理的重担中解放出来&#xff0c;让…

再战Nvidia,安装 Windows 11 和 EndeavourOS 双系统

吐血刚装了一周的Ubuntu23.04就挂了&#xff0c;由于买的是最新的显卡就上了Test版本&#xff0c;结果Ubuntu自带的nvidia驱动535居然会失灵&#xff0c;nvidia-smi直接fail。于是换了一堆发行版本&#xff0c;但是我这个主板没带hdmi不支持集显输出&#xff0c;必须安装时就上…

游戏初学者的变化

一&#xff0c;游戏界面的美化 1&#xff0c;标题的渐变放大 2&#xff0c;详细内容的打字机式出现 3&#xff0c;开始游戏的晃动 二&#xff0c;游戏模型的建立 1&#xff0c;模型的初步放置 2&#xff0c;模型的初步动作设计 旋转&#xff0c;反复横跳 3&#xff0c;模型的具…