关于字符串反转

时间:2021-06-10 17:02:51
我折腾了一天也没搞定

谁帮我看看给写一段源码,弄的我头都大了

我得到一个16进制的字符串 我想反转他 


int sun=0x049293a1;
int kun;
我想让
kun=0xa1939204 


谁能帮帮我

23 个解决方案

#1


#include<stdio.h>
#include<math.h>
main()
{
long a=0xa12,num=0;
int b[10];
int i=0,j;
while(a!=0)
{
   b[i++]=a%16;
   a=a/16;
}
for(j=0;j<i;j++)
  num+=b[i-j-1]*pow(16,j);
printf("0x%x",num);
}

#2


关于字符串反转long就那么大 数字不能太大  
可以转成字符串做 那样就简单了

#3


关于字符串反转楼主的反转没看懂啊 

#4


大端小端的转换?

#5


引用 3 楼 zhuankeshumo 的回复:
楼主的反转没看懂啊


啊。。。就是把   16进制的  049293A1 转换成  A1939204

#6


引用 4 楼 ananluowei 的回复:
大端小端的转换?

这样说楼主不会懂的  实现下

#8



_asm
{
lea esi,kun
mov ecx,0x049293a1
mov [esi],ecx
lea ebx,kun
mov ebx,[ebx]

}
我用汇编,这样最后得到EBX的值 就反转了 就是不知道C应该怎么写

#9


不是很难的吧,用字符串按照字节掉头就可以了。
只能用在整形的类型,浮点数应该不行,没试过。

#include <iostream>

int main()
{
using namespace std;
int sun, kun;
sun = 0x049293a1;
char* a = (char*)&sun;
char* b = (char*)&kun;
int len = sizeof(sun);
for (int i = 0; i < len; i++)
b[i] = a[len - i - 1];
cout << hex;
cout << "sun = "<< showbase << sun << endl;
cout << "kun = "<< showbase << kun << endl;
return 0;
}

#10


有点小错误,应该用unsigned char
而且没考虑负数的符号位。

#11



#include <iostream>
using namespace std;
int main()
{
    int sun;
    sun = 0x049293a1;
int i=4;
int result=0x0;
int t=0xff;
while(i>0)
{
result=result<<8;
result =result+(sun & t);
i--;
sun=sun>>8;
}
    cout << "result = "<<hex<< showbase << result << endl;
    return 0;
}

#12




#include <stdio.h>
int main()
{
    struct EChar{
        unsigned char a:4;
        unsigned char b:4;
    };
    long ld = ld = 0x1a2b3c4dl;     
    EChar* p = (EChar*)&ld; 
    for(int i =0; i < sizeof(long); i++)
    {
        int t = (p->a == 0xa ? sizeof(long) - i : i); 
        printf("%x%x", p[t].a,p[t].b);     
    }
    return 0;
}

#13


楼主的问题貌似是很具体的整型的大小端转换

一行即可

int main()
{
int sun=0x049293a1;
int re=((sun & 0x0f0f0f0f) << 4) | ((sun & 0xf0f0f0f0) >> 4);

return 0;
}

#14


更正楼上,右移要考虑符号,转成无符号整数处理

int main()
{
int sun=0x049293a1;
int re=((sun & 0x0f0f0f0f) << 4) | ((unsigned int)(sun & 0xf0f0f0f0) >> 4);

return 0;
}

#15


是这样反转么?

/**
 * @file    i32rev.c
 * @brief   
 */

#include <stdio.h>

union i32ch {
    int  n;
    char ch[4];
};

int main(int argc, char *argv[])
{
    int sun = 0x049293a1;
    int kun;
    union i32ch ic;
    char ch;

    ic.n = sun;

    ch = ic.ch[0];
    ic.ch[0] = ic.ch[3];
    ic.ch[3] = ch;

    ch = ic.ch[1];
    ic.ch[1] = ic.ch[2];
    ic.ch[2] = ch;

    kun = ic.n;

    printf("%08x %08x\n", sun, kun);

    return 0;
}

#16


简单啊!!!

int sun = 0x049293a1;
int kun = 0xa1939204;


这样不就OK了嘛

#17


( ((v) << 24) | (((v) >> 24) & 0xff) | (((v) << 8) & 0xff0000) | (((v) >> 8) & 0xff00) )

#18


引用 17 楼 nice_cxf 的回复:
( ((v) << 24) | (((v) >> 24) &amp; 0xff) | (((v) << 8) &amp; 0xff0000) | (((v) >> 8) &amp; 0xff00) )


这个没必要吧,#14楼不是更简单?

#19


#include<stdio.h>
int main()
{
    int sun=0x049293a1;

int kun=0;
int temp=0;

    int i=0;
for(i=0;i<4;i++)
{
  temp=0xff&sun>>(8*i);
  kun=kun|temp<<(8*(3-i));
}
     printf("%x",kun);
    return 0;
}

#20


引用 18 楼 yisikaipu 的回复:
引用 17 楼 nice_cxf 的回复:( ((v) << 24) | (((v) >> 24) &amp;amp; 0xff) | (((v) << 8) &amp;amp; 0xff0000) | (((v) >> 8) &amp;amp; 0xff00) )

这个没必要吧,#14楼不是更简单?

14楼那个是错的把?这个应该是vc里面的这样用的,

#21


引用 20 楼 nice_cxf 的回复:
14楼那个是错的把?这个应该是vc里面的这样用的,


和VC有关系?反应不过来。求详解

#22



#define MAKEWORD(a, b)      ((WORD)(((BYTE)(a)) | ((WORD)((BYTE)(b))) << 8))
#define MAKELONG(a, b)      ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))
#define LOWORD(l)           ((WORD)(l))
#define HIWORD(l)           ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
#define LOBYTE(w)           ((BYTE)(w))
#define HIBYTE(w)           ((BYTE)(((WORD)(w) >> 8) & 0xFF))
typedef unsigned short      WORD; 
typedef unsigned char       BYTE;
void ID_TO_DI(void)
{
int ID=0x1a2b3c4d;

WORD H_id=HIWORD(ID);//将ID高位0x1a2b赋给H_id

WORD L_id=LOWORD(ID);//将ID低位0x3c4d赋给L_id

BYTE szData[4];

BYTE *pCur=szData;

*pCur++=LOBYTE(L_id);//0x4d

*pCur++=HIBYTE(L_id);//0x3c

*pCur++=LOBYTE(H_id);//0x2b

*pCur++=HIBYTE(H_id);//0x1a

WORD id_H=MAKEWORD(szData[1],szData[0]);//0x4d3c

WORD id_L=MAKEWORD(szData[3],szData[2]);//0x2b1a

int  ID_value=MAKELONG(id_L,id_H);//0x4d3c2b1a



上面定的 宏  VC++ 6.0和VS2008都有。

#23


引用 20 楼 nice_cxf 的回复:
14楼那个是错的把?这个应该是vc里面的这样用的,


呵呵,刚发现我看错楼主的题目了

#1


#include<stdio.h>
#include<math.h>
main()
{
long a=0xa12,num=0;
int b[10];
int i=0,j;
while(a!=0)
{
   b[i++]=a%16;
   a=a/16;
}
for(j=0;j<i;j++)
  num+=b[i-j-1]*pow(16,j);
printf("0x%x",num);
}

#2


关于字符串反转long就那么大 数字不能太大  
可以转成字符串做 那样就简单了

#3


关于字符串反转楼主的反转没看懂啊 

#4


大端小端的转换?

#5


引用 3 楼 zhuankeshumo 的回复:
楼主的反转没看懂啊


啊。。。就是把   16进制的  049293A1 转换成  A1939204

#6


引用 4 楼 ananluowei 的回复:
大端小端的转换?

这样说楼主不会懂的  实现下

#7


#8



_asm
{
lea esi,kun
mov ecx,0x049293a1
mov [esi],ecx
lea ebx,kun
mov ebx,[ebx]

}
我用汇编,这样最后得到EBX的值 就反转了 就是不知道C应该怎么写

#9


不是很难的吧,用字符串按照字节掉头就可以了。
只能用在整形的类型,浮点数应该不行,没试过。

#include <iostream>

int main()
{
using namespace std;
int sun, kun;
sun = 0x049293a1;
char* a = (char*)&sun;
char* b = (char*)&kun;
int len = sizeof(sun);
for (int i = 0; i < len; i++)
b[i] = a[len - i - 1];
cout << hex;
cout << "sun = "<< showbase << sun << endl;
cout << "kun = "<< showbase << kun << endl;
return 0;
}

#10


有点小错误,应该用unsigned char
而且没考虑负数的符号位。

#11



#include <iostream>
using namespace std;
int main()
{
    int sun;
    sun = 0x049293a1;
int i=4;
int result=0x0;
int t=0xff;
while(i>0)
{
result=result<<8;
result =result+(sun & t);
i--;
sun=sun>>8;
}
    cout << "result = "<<hex<< showbase << result << endl;
    return 0;
}

#12




#include <stdio.h>
int main()
{
    struct EChar{
        unsigned char a:4;
        unsigned char b:4;
    };
    long ld = ld = 0x1a2b3c4dl;     
    EChar* p = (EChar*)&ld; 
    for(int i =0; i < sizeof(long); i++)
    {
        int t = (p->a == 0xa ? sizeof(long) - i : i); 
        printf("%x%x", p[t].a,p[t].b);     
    }
    return 0;
}

#13


楼主的问题貌似是很具体的整型的大小端转换

一行即可

int main()
{
int sun=0x049293a1;
int re=((sun & 0x0f0f0f0f) << 4) | ((sun & 0xf0f0f0f0) >> 4);

return 0;
}

#14


更正楼上,右移要考虑符号,转成无符号整数处理

int main()
{
int sun=0x049293a1;
int re=((sun & 0x0f0f0f0f) << 4) | ((unsigned int)(sun & 0xf0f0f0f0) >> 4);

return 0;
}

#15


是这样反转么?

/**
 * @file    i32rev.c
 * @brief   
 */

#include <stdio.h>

union i32ch {
    int  n;
    char ch[4];
};

int main(int argc, char *argv[])
{
    int sun = 0x049293a1;
    int kun;
    union i32ch ic;
    char ch;

    ic.n = sun;

    ch = ic.ch[0];
    ic.ch[0] = ic.ch[3];
    ic.ch[3] = ch;

    ch = ic.ch[1];
    ic.ch[1] = ic.ch[2];
    ic.ch[2] = ch;

    kun = ic.n;

    printf("%08x %08x\n", sun, kun);

    return 0;
}

#16


简单啊!!!

int sun = 0x049293a1;
int kun = 0xa1939204;


这样不就OK了嘛

#17


( ((v) << 24) | (((v) >> 24) & 0xff) | (((v) << 8) & 0xff0000) | (((v) >> 8) & 0xff00) )

#18


引用 17 楼 nice_cxf 的回复:
( ((v) << 24) | (((v) >> 24) &amp; 0xff) | (((v) << 8) &amp; 0xff0000) | (((v) >> 8) &amp; 0xff00) )


这个没必要吧,#14楼不是更简单?

#19


#include<stdio.h>
int main()
{
    int sun=0x049293a1;

int kun=0;
int temp=0;

    int i=0;
for(i=0;i<4;i++)
{
  temp=0xff&sun>>(8*i);
  kun=kun|temp<<(8*(3-i));
}
     printf("%x",kun);
    return 0;
}

#20


引用 18 楼 yisikaipu 的回复:
引用 17 楼 nice_cxf 的回复:( ((v) << 24) | (((v) >> 24) &amp;amp; 0xff) | (((v) << 8) &amp;amp; 0xff0000) | (((v) >> 8) &amp;amp; 0xff00) )

这个没必要吧,#14楼不是更简单?

14楼那个是错的把?这个应该是vc里面的这样用的,

#21


引用 20 楼 nice_cxf 的回复:
14楼那个是错的把?这个应该是vc里面的这样用的,


和VC有关系?反应不过来。求详解

#22



#define MAKEWORD(a, b)      ((WORD)(((BYTE)(a)) | ((WORD)((BYTE)(b))) << 8))
#define MAKELONG(a, b)      ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))
#define LOWORD(l)           ((WORD)(l))
#define HIWORD(l)           ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
#define LOBYTE(w)           ((BYTE)(w))
#define HIBYTE(w)           ((BYTE)(((WORD)(w) >> 8) & 0xFF))
typedef unsigned short      WORD; 
typedef unsigned char       BYTE;
void ID_TO_DI(void)
{
int ID=0x1a2b3c4d;

WORD H_id=HIWORD(ID);//将ID高位0x1a2b赋给H_id

WORD L_id=LOWORD(ID);//将ID低位0x3c4d赋给L_id

BYTE szData[4];

BYTE *pCur=szData;

*pCur++=LOBYTE(L_id);//0x4d

*pCur++=HIBYTE(L_id);//0x3c

*pCur++=LOBYTE(H_id);//0x2b

*pCur++=HIBYTE(H_id);//0x1a

WORD id_H=MAKEWORD(szData[1],szData[0]);//0x4d3c

WORD id_L=MAKEWORD(szData[3],szData[2]);//0x2b1a

int  ID_value=MAKELONG(id_L,id_H);//0x4d3c2b1a



上面定的 宏  VC++ 6.0和VS2008都有。

#23


引用 20 楼 nice_cxf 的回复:
14楼那个是错的把?这个应该是vc里面的这样用的,


呵呵,刚发现我看错楼主的题目了