gpt4 book ai didi

复制整数的低位字节,同时保留字节顺序

转载 作者:行者123 更新时间:2023-12-05 02:14:12 25 4
gpt4 key购买 nike

我需要编写一个函数,将给定整数的指定数量的低位字节复制到内存中的地址,同时保留它们的顺序。

void lo_bytes(uint8_t *dest, uint8_t no_bytes, uint32_t val)

我希望用法看起来像这样:

uint8 dest[3];
lo_bytes(dest, 3, 0x44332211);
// Big-endian: dest = 33 22 11
// Little-endian: dest = 11 22 33

我尝试使用移位、memcpy 和使用 for 循环遍历 val 的每个字节来实现该功能,但我所有的尝试未能处理一个或另一个字节顺序。

是否有可能以独立于平台的方式执行此操作,或者我是否需要使用 #ifdef 并为每个字节顺序编写一段单独的代码?

最佳答案

I've tried to implement the function using bit-shifts, memcpy, and iterating over each byte of val with a for-loop, but all of my attempts failed to work on either one or the other endianness.

所有算术,包括按位算术,都是根据操作数的定义的,而不是它们的表示。这对您来说还不够,因为您希望根据类型 uint32_t 的表示样式的详细信息获得不同的结果。

您可以通过各种方法对对象表示进行操作,但您仍然需要知道要对哪些字节进行操作。这需要某种形式的检测。如果 big-endian 和 little-endian 是您唯一关心支持的字节顺序,那么我赞成类似于@P__J__ 的回答中给出的方法:

void lo_bytes(uint8_t *dest, uint8_t no_bytes, uint32_t val) {
static const union { uint32_t i; uint8_t a[4] } ubytes = { 1 };

memcpy(dest, &val + (1 - ubytes.a[0]) * (4 - no_bytes), no_bytes);
}

表达式 (1 - ubytes.a[0]) 如果 uint32_t 的表示是大端字节序,则计算结果为 1,在这种情况下,高位字节出现在 val 表示的开头。在那种情况下,我们要跳过表示的第一个 4 - no_bytes 并复制其余部分。另一方面,如果 uint32_t 具有小端表示法,则 (1 - ubytes.a[0]) 的计算结果为 0,结果是 memcpy 从表示的开头开始。在每种情况下,无论从 val 的表示中复制哪个字节,它们的顺序都会保持不变。这就是 memcpy() 所做的。

关于复制整数的低位字节,同时保留字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53890945/

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