C 交换整数中的备用字节

C 交换整数中的备用字节,c,byte,bit,swap,C,Byte,Bit,Swap,问题:交换备用字节,如下所示: 输入:uint8_t buf[4]={0xab,0xcd,0xef,0xba} 输出:0xcdababef 我有下面的代码,但我想知道是否有更好的方法来缩短代码 #include <stdint.h> #define SWAP_16(buf) (((buf & 0xFF00) >> 8) | ((buf & 0x00FF) << 8)) int main() { unsigned int value;

问题:交换备用字节,如下所示:

输入:uint8_t buf[4]={0xab,0xcd,0xef,0xba}

输出:0xcdababef

我有下面的代码,但我想知道是否有更好的方法来缩短代码

#include <stdint.h>
#define SWAP_16(buf) (((buf & 0xFF00) >> 8) | ((buf & 0x00FF) << 8))
int main()
{
    unsigned int value;
    int i, j=0;
    uint8_t buf[4] = {0,4,0,0};
    unsigned int mask = 0xFFFF;
    unsigned int tmp_value;
    unsigned int size = 4;

    for (i = size - 1 ;i >= 0; i--) {
        tmp_value |= (buf[j] << 8*i);
        j++;
    }

    value = SWAP_16((tmp_value & (mask << 16)) >> 16) << 16 |
        SWAP_16(tmp_value & mask);  
    return 0;
}
#包括
#定义交换16(buf)((buf&0xFF00)>>8)((buf&0x00FF)=0;i--){
tmp|u值|=(buf[j]16)使用并集

#include <stdint.h>


#define SWAP_VAR(T, v1, v2) do { \
  T v = (v1); \
  (v1) = (v2); \
  (v2) = v; \
} while (0);

union U32
{
  uint32_t u;
  unsigned char a[4];
};

uint32_t swap32(uint32_t u)
{
  union U32 u32 = {u};

  SWAP_VAR(unsigned char, u32.a[0], u32.a[1]);
  SWAP_VAR(unsigned char, u32.a[2], u32.a[3]);

  return u32.u;
}
#包括
#定义交换变量(T,v1,v2)do{\
tV=(v1)\
(v1)=(v2)\
(v2)=v\
}而(0);
联合U32
{
uint32_t u;
无符号字符a[4];
};
uint32_t swap32(uint32_t u)
{
联合U32 U32={u};
SWAP_VAR(无符号字符,u32.a[0],u32.a[1]);
SWAP_VAR(无符号字符,u32.a[2],u32.a[3]);
返回u32.u;
}
像这样使用它:

#include <stdint.h>

uint32_t swap32(uint32_t u);


int main(void)
{
  uint32_t u = 0x12345678;
  u = swap32(u);
}
#包括
uint32_t swap32(uint32_t u);
内部主(空)
{
uint32_t u=0x12345678;
u=swap32(u);
}
使用接头

#include <stdint.h>


#define SWAP_VAR(T, v1, v2) do { \
  T v = (v1); \
  (v1) = (v2); \
  (v2) = v; \
} while (0);

union U32
{
  uint32_t u;
  unsigned char a[4];
};

uint32_t swap32(uint32_t u)
{
  union U32 u32 = {u};

  SWAP_VAR(unsigned char, u32.a[0], u32.a[1]);
  SWAP_VAR(unsigned char, u32.a[2], u32.a[3]);

  return u32.u;
}
#包括
#定义交换变量(T,v1,v2)do{\
tV=(v1)\
(v1)=(v2)\
(v2)=v\
}而(0);
联合U32
{
uint32_t u;
无符号字符a[4];
};
uint32_t swap32(uint32_t u)
{
联合U32 U32={u};
SWAP_VAR(无符号字符,u32.a[0],u32.a[1]);
SWAP_VAR(无符号字符,u32.a[2],u32.a[3]);
返回u32.u;
}
像这样使用它:

#include <stdint.h>

uint32_t swap32(uint32_t u);


int main(void)
{
  uint32_t u = 0x12345678;
  u = swap32(u);
}
#包括
uint32_t swap32(uint32_t u);
内部主(空)
{
uint32_t u=0x12345678;
u=swap32(u);
}
现在,反向为0x78563412

现在,反向为0x78563412,这里有一种方法:

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    uint8_t buf[4] = {0xab,0xcd,0xef,0xba};

    unsigned int out = buf[1] * 0x1000000u + buf[0] * 0x10000u + buf[3] * 0x100u + buf[2];
    printf("%x\n", out);
}
#包括
#包括
内部主(空)
{
uint8_t buf[4]={0xab,0xcd,0xef,0xba};
无符号整数输出=buf[1]*0x1000000u+buf[0]*0x10000u+buf[3]*0x100u+buf[2];
printf(“%x\n”,out);
}
这里有一种方法:

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    uint8_t buf[4] = {0xab,0xcd,0xef,0xba};

    unsigned int out = buf[1] * 0x1000000u + buf[0] * 0x10000u + buf[3] * 0x100u + buf[2];
    printf("%x\n", out);
}
#包括
#包括
内部主(空)
{
uint8_t buf[4]={0xab,0xcd,0xef,0xba};
无符号整数输出=buf[1]*0x1000000u+buf[0]*0x10000u+buf[3]*0x100u+buf[2];
printf(“%x\n”,out);
}

您的问题还不清楚这是否是一个选项,但如果您知道数组的大小不会改变,您只需交换数组中的字节即可:

#include <stdio.h>
#include <stdint.h>
#define SWAPPED(b) { b[1], b[0], b[3], b[2] }
#define PRINT(b) printf("0x0%x\n", *((uint32_t*)b));

int main()
{
    uint8_t buf[4] = {8,4,6,1};
    uint8_t swapped[4] = SWAPPED(buf);
    PRINT(buf);
    PRINT(swapped);
    return 0;
}
这是因为endian属性和打印一个强制转换为整数类型的数组,但是字节会按照您在问题中提出的要求进行交换


希望这能有所帮助。

您的问题还不清楚这是否是一个选项,但如果您知道数组的大小不会改变,您只需交换数组中的字节即可:

#include <stdio.h>
#include <stdint.h>
#define SWAPPED(b) { b[1], b[0], b[3], b[2] }
#define PRINT(b) printf("0x0%x\n", *((uint32_t*)b));

int main()
{
    uint8_t buf[4] = {8,4,6,1};
    uint8_t swapped[4] = SWAPPED(buf);
    PRINT(buf);
    PRINT(swapped);
    return 0;
}
这是因为endian属性和打印一个强制转换为整数类型的数组,但是字节会按照您在问题中提出的要求进行交换


希望对您有所帮助。

假设
unsigned int
为32位,您只需使用:

value = ((value & 0xff00ff00) >> 8) | ((value & 0x00ff00ff) << 8);

value=((value&0xff00ff00)>>8)|((value&0x00ff00ff)假设
unsigned int
为32位,您可以简单地使用:

value = ((value & 0xff00ff00) >> 8) | ((value & 0x00ff00ff) << 8);



value=((value&0xff00ff00)>>8)|((value&0x00ff00ff)
unsigned int n=((unsigned int)buf[0]
unsigned int n=((unsigned int)buf[0]为什么要使用
int
?只需交换数组中的字节…
#定义交换的(b){b[1]、b[0]、b[3]、b[2]
uint8\buf
。?您是指作为预期输出的
0xcdabbaef
?如果不是,则不清楚您的规定是什么(对于32位
无符号int
):
value=((value&0xff00ff00)>>8)|((value&0x00ff00ff)@M.M:这是预期的输出,解释得很清楚。你为什么不这么认为?为什么使用
int
?只需交换数组中的字节….
#定义交换的(b){b[1],b[0],b[3],b[2]}
uint8\u t bswap[4]=SWAPPED(buf)
。?您是指作为预期输出的
0xcdabbaef
?如果不是,则不清楚您的规定是什么(对于32位
无符号int
):
value=((value&0xff00ff00)>>8)|((value&0x00ff00ff)@M.M:这是预期的输出,解释得很清楚。你为什么不这么认为?这不是违反了严格的别名规则吗?这是错误的!!你没有正确地理解这个问题。@alk不,字符类型可能用于读写其他类型。我为他辩护,他在这个问题中有一个类型仍然存在,所以谁知道他真正想要什么。Te从技术上讲,他的问题是要移动3个字节,复制一个。这不是违反了严格的别名规则吗?这是错误的!!你没有正确地看到这个问题。@alk不,字符类型可能被用来读写其他类型在我的辩护中,他在这个问题中有一个类型仍然存在,所以谁知道他真正想要什么。从技术上说,f从他的问题中,他想移动3个字节,复制一个。你运行这个程序了吗?
a[2]=c;
应该是
a[3]=c;
是的,是的,修复了这个草率的问题……对不起!@M。M@user3053970:很公平,但是概念很清楚,不是吗?;-)你运行这个程序了吗?
a[2]=c;
应该是
a[3]=c;
是的,是的,修复了这个问题……对不起!@M。M@user3053970:很公平,但是概念很清楚,不是吗?;-)很好的逻辑。你是从哪里得到这个想法的:)?@user3053970,我做C有一段时间了:)请注意,这有一个别名problem@user3053970,你说它没有输出是什么意思?这是你打印出来的预期输出。@txtechhelp:仔细看看输出尼斯的逻辑。你从哪里得到这个想法的:)?@user3053970,我已经做了一段时间的C:)请注意,这有一个别名problem@user3053970,你说它没有输出是什么意思?这是给定打印内容的预期输出。@txtechhelp:仔细查看输出你是否理解位值系统,例如,十进制123表示100+20+3。十六进制相同,0x123表示0x100+0x20+0x3。在这种情况下,我们一次输入两位数字:0x12345678表示0x12000000+0x340000+0x5600+0x78。您是否理解位值系统,例如十进制123表示100+20+3。十六进制相同,0x123表示0x100+0x20+0x3。在这种情况下,我们一次输入两位数字:0x12345678表示