c# - 在 C++ 中正确返回 uint16_t 数组的方法
问题描述
我有我的 C# 代码,它返回 uint 数组,但我想用 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;
}
解决方案
永远不要使用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;
}
推荐阅读
- django - 使用 prefetch_related 过滤没有子对象的父对象
- c++ - Clang 不允许在默认参数之后使用可变参数,gcc 允许
- reactjs - 摩纳哥编辑器 deltaDecorations 更改整个文本的样式,而不仅仅是给定范围
- ssis - 当 Fact 表中的记录发生变化时该怎么办?
- r - 使用 lapply 将 R 中的两个矩阵列表相乘
- azure - 在 Azure DevOps 中关闭项目
- javascript - Node.js Handlebars 将数据从 mySQL 数据库显示到引导模式
- windows - 更改了phpmyadmin密码,现在我无法进入
- flutter - 使用 Flutter 将自定义屏幕投射到 Chromecast
- javascript - 使用 Redux Toolkit 连接 Redux Store