gpt4 book ai didi

c - 将指向 uint16_t 的指针传递给期望 C 中的 uint8_t[] 数组的子例程 - 怎么做?

转载 作者:行者123 更新时间:2023-12-01 23:16:47 25 4
gpt4 key购买 nike

我有一个需要两个参数的子例程:uint8_t[] 数组缓冲区和 uint16_t 大小:
void getData(uint8_t * pData, uint16_t size)
我想传递一个指向 uint16_t 变量的指针,而不是 2 字节数组指针,这样我以后就不必将数组内容转换为 uint16_t 变量。这是我尝试过的:

uint16_t value;
uint8_t values[2];
// instead of:
getData(values, 2);
value = (values[0] << 8) | values[1];
// I want to simply call:
getData((uint8_t *)&value, 2);

上述方法没有产生预期的结果。正确的做法是什么?
请指教。

最佳答案

getData((uint8_t *)&value, 2);

The above approach does not yield the expected result.

问题是不同的计算机系统对多字节整数使用不同的顺序。您的第一个示例将数据解释为最低地址中的最高有效字节和最高地址中的最低有效字节。这被称为“大端”字节顺序(大端在前)。

如果您的第二次尝试产生了不同的结果,那么我们可以推断您的系统使用了另一种顺序,“little endian”。事实上,这很典型。例如,x86 CPU 架构使用小端字节序。

What is the correct way?

将字节序列解释为大端整数的正确且可移植的方法是您不想做的方法:

// instead of:
getData(values, 2);
value = (values[0] << 8) | values[1];

您想要执行的操作仅适用于将字节序列解释为“ native ”字节顺序中的整数。在 native 字节顺序不是大端的系统上,这是一个不同的操作。此操作在不同字节顺序的系统上表现不同,因此不可移植。

关于c - 将指向 uint16_t 的指针传递给期望 C 中的 uint8_t[] 数组的子例程 - 怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68699380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com