反转c中的字节顺序

问题描述 投票:0回答:5

我在 cs:app datalab 中解决“reverseBytes”时遇到问题。

我必须编写返回相反字节顺序的代码。

示例:输入=0x123456,返回=0x563412

当我使用我的代码时,它无法获得分数..

int reverseBytes(int x) {
  int mask=0xff;
  int byte1=x>>24;
  int byte2=(x>>16)&mask;
  int byte3=(x>>8)&mask;
  int byte4=x&mask;
  int result=(byte4<<24)|(byte3<<16)|(byte2<<8)|(byte1);

  return result;
}

但是,当我使用别人的代码时,它需要得分。

int reverseBytes(int x) {
  int t2=~(0xff<<24);
  int s1=(0xff<<16)+0xff;
  int s2=0xff<<8;
  int s3=(s2<<16)+s2;
  int temp=(x&s1)<<8|((x&s3)>>8&t2);
  int q1=(0xff<<8)+0xff;
  int q2=q1<<16;
  int temp2=(temp&q1)<<16|((temp&q2)>>16&(~q2));

  return temp2;
}

我不知道为什么我的代码不能工作.. 我测试了我的代码和其他人的代码。 但我找不到我的代码的结果和另一个代码的结果之间的差异。 请帮助我..

c memory bit-manipulation byte
5个回答
5
投票

简单的右移即可获取所需的字节:

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

uint32_t reverse_bytes(uint32_t bytes)
{
    uint32_t aux = 0;
    uint8_t byte;
    int i;

    for(i = 0; i < 32; i+=8)
    {
        byte = (bytes >> i) & 0xff;
        aux |= byte << (32 - 8 - i);
    }
    return aux;
}

测试

int main(void) {
    uint32_t input = 0x123456;
    printf("input: 0x%08x\n", input);
    input = reverse_bytes(input);
    printf("input: 0x%08x\n", input);
    return 0;
}

打印:

输入:0x00123456

输入:0x56341200


3
投票

用这个:

#define reverse_bytes_32(num) ( ((num & 0xFF000000) >> 24) | ((num & 0x00FF0000) >> 8) | ((num & 0x0000FF00) << 8) | ((num & 0x000000FF) << 24) )

0
投票

以下函数可交换您想要的任意长度的字节字符串。

swapbytes()
交换
inp
内部
inp
参数中包含的所有字节,从而修改
inp
的内容。
swapbytesout()
交换
inp
参数内
out
参数的内容,则不会修改
inp
的内容。

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

void * swapbytes(void *inp, size_t len);
void * swapbytesout(void * inp, void *out, size_t len);

/* This function swaps and modifies the content of inp
 *
 * Returns: a pointer to the output value (inp) */
void * swapbytes(void *inp, size_t len)
{
    unsigned int i;
    unsigned char *in=(unsigned char *)inp,tmp;

    for(i=0;i<len/2;i++) {
        tmp=*(in+i);
        *(in+i)=*(in+len-i-1);
        *(in+len-i-1)=tmp;
    }

    return inp;
}

/* This function doesn't swap and doesn't modify the content
 * of inp, the output is computed on out.
 *
 * Returns: a pointer to the output value (out) */
void * swapbytesout(void *inp, void *out, size_t len)
{
    unsigned int i;
    unsigned char *o=(unsigned char *)out;
    unsigned char *in=(unsigned char *)inp;

    for(i=0;i<len;i++) {
        *(o+len-i-1)=*(in+i);
    }

    return out;
}

int main(void)
{
    uint32_t a0,a1;
    uint64_t b0,b1;

    a0=0x12345678;
    printf("%08X\n",*(uint32_t *)swapbytesout(&a0,&a1,sizeof(a0)));
    printf("%08X %08X\n",a0,a1);

    printf("%08X\n",*(uint32_t *)swapbytes(&a0,sizeof(a0)));
    printf("%08X\n",a0);

    puts("");

    b0=0x123456789ABCDEF0ULL;
    printf("%016"PRIX64"\n",*(uint64_t *)swapbytesout(&b0,&b1,sizeof(b0)));
    printf("%016"PRIX64" %016"PRIX64"\n",b0,b1);

    printf("%016"PRIX64"\n",*(uint64_t *)swapbytes(&b0,sizeof(b0)));
    printf("%016"PRIX64"\n",b0);
    return 0;
}

0
投票

移位运算符保留签名。尝试更改“int byte1=x>>24;”到“”int byte1=x>>24&mask;”。 或者只是切换到使用无符号整数。


0
投票

这是我对不同数量字节的字节顺序进行反转的实现。

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

void reverse_byte_order(void *data, uint32_t num_bytes) {
    void *dest = malloc(num_bytes);

    for (int i = 0; i < num_bytes; ++i) {
        memcpy(dest + num_bytes - i - 1, data + i, 1);
    }
    memcpy(data, dest, num_bytes);
    free(dest);
}

int main() {
    uint32_t data1 = 0x12345678;
    printf("0x%08x\n", data1);
    reverse_byte_order(&data1, 4);
    printf("0x%08x\n", data1);

    uint32_t data2 = 0xabcdef;
    printf("0x%04x\n", data2);
    reverse_byte_order(&data2, 3);
    printf("0x%04x\n", data2);

    return 0;
}

输出为:

0x12345678
0x78563412
0xabcdef
0xefcdab

此实现不需要位移位或

AND
/
OR
操作。它基本上只是将内存从一个地方复制到另一个地方。但在我看来,它看起来更简单。

© www.soinside.com 2019 - 2024. All rights reserved.