将 int16_t 数组打包成多个 uint64_t

huangapple go评论87阅读模式
英文:

Pack array of int16_t into multiple uint64_t

问题

以下是您提供的代码的翻译部分:

  1. 我有一个包含N6个条目的数组
  2. ```cpp
  3. const int16_t xzyabc[][6] PROGMEM = {
  4. {1, 2, 3, 4, 5, 6},
  5. {7, 8, 9, 10, 11, 12},
  6. };
  7. 数组中的每个值都是int16_t数字
  8. 对于每四个int16_t,我想将它们打包到一个uint64_t中
  9. 我尝试了下面的代码。
  1. void Telemetry::loop()
  2. {
  3. const size_t numArrays = sizeof(xzyabc) / sizeof(xzyabc[0]);
  4. const size_t elementsPerArray = sizeof(xzyabc[0]) / sizeof(xzyabc[0][0]);
  5. const size_t elementsPerUint64 = 4;
  6. const size_t numUint64 = (numArrays * elementsPerArray + elementsPerUint64 - 1) / elementsPerUint64;
  7. uint64_t convertedArray[numUint64];
  8. for (size_t i = 0; i < numUint64; i++)
  9. {
  10. uint64_t value = 0;
  11. for (size_t j = 0; j < elementsPerUint64; j++)
  12. {
  13. size_t index = i * elementsPerUint64 + j;
  14. if (index < numArrays * elementsPerArray)
  15. {
  16. int16_t element = xzyabc[index / elementsPerArray][index % elementsPerArray];
  17. value |= static_cast<uint64_t>(element) << (16 * j);
  18. }
  19. }
  20. uint32_t upperPart = (uint32_t)(value >> 32);
  21. uint32_t lowerPart = (uint32_t)(value & 0xFFFFFFFF);
  22. Serial.print("Number: ");
  23. Serial.print(upperPart);
  24. Serial.print(lowerPart);
  25. Serial.println();
  26. convertedArray[i] = value;
  27. }
  28. callback(convertedArray, numUint64);
  29. }

上面的代码的思想是遍历数组,对于每四个元素,将它们放入一个无符号整数中。

结果是:

  1. Number: 262147131073
  2. Number: 524295393221
  3. Number: 786443655369

这些结果看起来对我来说是错误的,我尝试在NodeJS中解包它失败了。

我该如何修复这个问题?或者我做错了什么?

  1. <details>
  2. <summary>英文:</summary>
  3. I have an array of N per 6 entries

const int16_t xzyabc[][6] PROGMEM = {
{1, 2, 3, 4, 5, 6},
{7, 8, 9, 10, 11, 12},
};

Each value in the array is an int16_t number.

For each four int16_t, I want to pack it onto a uint64_t.

I tried the code below.

void Telemetry::loop()
{
const size_t numArrays = sizeof(xzyabc) / sizeof(xzyabc[0]);
const size_t elementsPerArray = sizeof(xzyabc[0]) / sizeof(xzyabc[0][0]);
const size_t elementsPerUint64 = 4;
const size_t numUint64 = (numArrays * elementsPerArray + elementsPerUint64 - 1) / elementsPerUint64;

uint64_t convertedArray[numUint64];

for (size_t i = 0; i < numUint64; i++)
{
uint64_t value = 0;
for (size_t j = 0; j < elementsPerUint64; j++)
{
size_t index = i * elementsPerUint64 + j;
if (index < numArrays * elementsPerArray)
{
int16_t element = xzyabc[index / elementsPerArray][index % elementsPerArray];
value |= static_cast<uint64_t>(element) << (16 * j);
}
}

  1. uint32_t parteSuperior = (uint32_t)(value &gt;&gt; 32);
  2. uint32_t parteInferior = (uint32_t)(value &amp; 0xFFFFFFFF);
  3. Serial.print(&quot;Number: &quot;);
  4. Serial.print(parteSuperior);
  5. Serial.print(parteInferior);
  6. Serial.println();
  7. convertedArray[i] = value;

}

callback(convertedArray, numUint64);
}

  1. The idea of the code above is to iterate over the array and for each quadrupled, put it on a unsigned integer.
  2. Results in:

Number: 262147131073
Number: 524295393221
Number: 786443655369

  1. And they look wrong to me, I tried to unpack it on NodeJS and it failed.
  2. How can I fix this? Or what I&#39;m doing wrong?
  3. </details>
  4. # 答案1
  5. **得分**: 0
  6. 根据@Peter的建议,我最终使用了memcpy函数。
  7. ```cpp
  8. uint64_t buffer[10]{0};
  9. memcpy(buffer, xzyabc, sizeof(xzyabc));
英文:

As sugestion of @Peter, I ended using memcpy

  1. uint64_t buffer[10]{0};
  2. memcpy(buffer, xzyabc, sizeof(xzyabc));

huangapple
  • 本文由 发表于 2023年7月11日 00:50:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/76655798.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定