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

标签 c# c++ unsigned-integer

<分区>

我有返回 uint 数组的 C# 代码,但我想在 C++ 中执行此操作。我看了其他帖子;他们使用 uint 指针数组,而我的数组不是。有谁知道如何正确返回 uint16_t 数组?

This is C# code works fine

  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;
        }

This is C++ code that creates syntax error

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;
}

最佳答案

不要使用 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)(demo)

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

#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;
}

关于c# - 在 C++ 中正确返回 uint16_t 数组的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57607736/

相关文章:

C# 如何查找并替换字符串中的特定文本?

c# - 从 SQL 查询 c# 创建树/XML 结构

c++ - 如何将 XMFLOAT3 转换为 const float *pData?

c++ - 比较来自一个 vector 的迭代器时,什么会引发 'iterators are incompatible'?

c++ - 尝试访问数组时数据从数组中丢失

c# - 将 C# 代码与 roslyn : comment disappears 合并

c# - 将光标设置在文本框的任何文本的末尾

java - 8 个十六进制数字超出了 Kotlin Int 的范围,但适用于 java int

javascript - 如何在 PHP 中执行正确的无符号右移?

c - 通过 fread 从 stdin 读取 unsigned int