为了账号安全,请及时绑定邮箱和手机立即绑定

在 C++ 中正确返回 uint16_t 数组的方法

在 C++ 中正确返回 uint16_t 数组的方法

C#
撒科打诨 2023-09-16 15:07:31
我有返回 uint 数组的 C# 代码,但我想在 C++ 中执行此操作。我看了其他帖子;他们使用 uint 指针数组,而我的数组不是。有谁知道如何正确返回 uint16_t 数组?这是 C# 代码,运行良好  public static UInt16[] GetIntArrayFromByteArray(byte[] byteArray)        {            if ((byteArray.Length % 2) == 1)                Array.Resize(ref byteArray, byteArray.Length + 1);            UInt16[] intArray = new UInt16[byteArray.Length / 2];            for (int i = 0; i < byteArray.Length; i += 2)                intArray[i / 2] = (UInt16)((byteArray[i] << 8) | byteArray[i + 1]);            return intArray;        }这是创建语法错误的 C++ 代码uint16_t[] GetIntArrayFromByteArray(byte[] byteArray){    //if ((byteArray.Length % 2) == 1)        //Array.Resize(ref byteArray, byteArray.Length + 1);    uint16_t[] intArray = new uint16_t[10];    for (int i = 0; i < 10; i += 2)        intArray[i / 2] = (uint16_t)((byteArray[i] << 8) | byteArray[i + 1]);    return intArray;}
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

Type[]永远不要使用。用途std::vector:


std::vector<uint16_t> GetIntArrayFromByteArray(std::vector<byte> byteArray)

{

    // If the number of bytes is not even, put a zero at the end

    if ((byteArray.size() % 2) == 1)

        byteArray.push_back(0);



    std::vector<uint16_t> intArray;


    for (int i = 0; i < byteArray.size(); i += 2)

        intArray.push_back((uint16_t)((byteArray[i] << 8) | byteArray[i + 1]));


    return intArray;

}

std::array<Type, Size>如果数组大小固定,您也可以使用。


更优化的版本(感谢@Aconcagua)(演示)

这是一个完整的代码,具有更优化的版本,不会复制或更改输入。如果您有很长的输入数组,这会更好。可以写得更短,但我想保持冗长并且对初学者友好。


#include <iostream>

#include <vector>


using byte = unsigned char;


std::vector<uint16_t> GetIntArrayFromByteArray(const std::vector<byte>& byteArray)

{

    const int inputSize = byteArray.size();

    const bool inputIsOddCount = inputSize % 2 != 0;

    const int finalSize = (int)(inputSize/2.0 + 0.5);

    // Ignore the last odd item in loop and handle it later

    const int loopLength = inputIsOddCount ? inputSize - 1 : inputSize;


    std::vector<uint16_t> intArray;

    // Reserve space for all items

    intArray.reserve(finalSize);

    for (int i = 0; i < loopLength; i += 2) 

    {

      intArray.push_back((uint16_t)((byteArray[i] << 8) | byteArray[i + 1]));

    }


    // If the input was odd-count, we still have one byte to add, along with a zero

    if(inputIsOddCount) 

    {

      // The zero in this expression is redundant but illustrative

      intArray.push_back((uint16_t)((byteArray[inputSize-1] << 8) | 0));

    }

    return intArray;

}


int main() {

    const std::vector<byte> numbers{2,0,0,0,1,0,0,1};

    const std::vector<uint16_t> result(GetIntArrayFromByteArray(numbers));


    for(uint16_t num: result) {

        std::cout << num << "\n";

    }


    return 0;

}


查看完整回答
反对 回复 2023-09-16
  • 1 回答
  • 0 关注
  • 62 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信