[C&C++]大小端字节序转换程序

大端模式:  数据的高字节存在低地址  数据的低字节存在高地址

小端模式:  数据的高字节存在高地址  数据的低字节存在低地址

如图,i为int类型占4个字节,但只有1个字节的值为1,另外3个字节值为0;取出低地址上的值,当其为1时则为小端模式,为0时为大端模式。

//大小端模式的判断
//方法一:利用联合体所有成员的起始位置一致,
//对联合体中的int类型赋值,然后判断联合体中char类型的值的大小
#include <iostream>
#include <iomanip>
using namespace std;

//signed
typedef signed char        int8;
typedef short              int16;
typedef int                int32;
typedef long long          int64;
//unsigned
typedef unsigned char      uint8;
typedef unsigned short     uint16;
typedef unsigned int       uint32;
typedef unsigned long long uint64;

#pragma pack(push)
#pragma pack(1)//单字节对齐
typedef struct{
    uint32 ID;
    uint32 Num;
    uint32 Type;
    uint32 lat;
    uint32 lng;
    uint32 alt;
    uint32 speed;
}Waypoint;//Payload_Data

#pragma pack(pop)

void EndianSwap(uint8 *pData, int startIndex, int length);

int main()
{

    Waypoint wp,wp_ori;
    int len = sizeof(Waypoint);
    cout << "size of Waypoint: " << len << endl;

    wp.ID    = 0x00000011;
    wp.Num   = 0x00002200;
    wp.Type  = 0xDD0CB0AA;
    wp.lat   = 0x00330000;
    wp.lng   = 0x44000000;
    wp.alt   = 0xABCD1234;
    wp.speed = 0x12345678;

    wp_ori = wp;

    int i = 0;
    uint8* pData = (uint8*)(&wp);
    for (i = 0; i < len; i += 4)
    {
        EndianSwap(pData,i,4);
    }

    cout << endl;
    cout << uppercase << hex << "改变字节序前: 0x" << setfill(‘0‘) << setw(8) << wp_ori.ID << endl;
    cout << uppercase << hex << "改变字节序后: 0x" <<setfill(‘0‘) << setw(8) << wp.ID <<endl;
    cout << endl;
    cout << uppercase << hex << "改变字节序前: 0x" << setfill(‘0‘) << setw(8) << wp_ori.Num << endl;
    cout << uppercase << hex << "改变字节序后: 0x" << setfill(‘0‘) << setw(8) << wp.Num << endl;
    cout << endl;
    cout << uppercase << hex << "改变字节序前: 0x" << setfill(‘0‘) << setw(8) << wp_ori.Type << endl;
    cout << uppercase << hex << "改变字节序后: 0x" << setfill(‘0‘) << setw(8) << wp.Type << endl;
    cout << endl;
    cout << uppercase << hex << "改变字节序前: 0x" << setfill(‘0‘) << setw(8) << wp_ori.lat << endl;
    cout << uppercase << hex << "改变字节序后: 0x" << setfill(‘0‘) << setw(8) << wp.lat << endl;
    cout << endl;
    cout << uppercase << hex << "改变字节序前: 0x" << setfill(‘0‘) << setw(8) << wp_ori.lng << endl;
    cout << uppercase << hex << "改变字节序后: 0x" << setfill(‘0‘) << setw(8) << wp.lng << endl;
    cout << endl;
    cout << uppercase << hex << "改变字节序前: 0x" << setfill(‘0‘) << setw(8) << wp_ori.alt << endl;
    cout << uppercase << hex << "改变字节序后: 0x" << setfill(‘0‘) << setw(8) << wp.alt << endl;
    cout << endl;
    cout << uppercase << hex << "改变字节序前: 0x" << setfill(‘0‘) << setw(8) << wp_ori.speed << endl;
    cout << uppercase << hex << "改变字节序后: 0x" << setfill(‘0‘) << setw(8) << wp.speed << endl;
    return 0;
}

void EndianSwap(uint8 *pData, int startIndex, int length)
{
    int i,cnt,end,start;
    cnt = length / 2;
    start = startIndex;
    end  = startIndex + length - 1;
    uint8 tmp;
    for (i = 0; i < cnt; i++)
    {
        tmp            = pData[start+i];
        pData[start+i] = pData[end-i];
        pData[end-i]   = tmp;
    }
}

  运行结果如下:

原文地址:https://www.cnblogs.com/wuyepeng/p/9833273.html

时间: 2024-09-30 19:40:43

[C&C++]大小端字节序转换程序的相关文章

最简单的方式教你理解大小端字节序

学过编程的人都应该知道大小端字节序的概念,但是很多时候,总是把他们弄混,这是整理出来的一份很简单的方式理解字节序的文章,废话不多说,这里直接入正题. 什么是字节序? 字节序,简单来说,就是指的超过一个字节的数据类型在内存中存储的顺序 那么就很明显了,像char这样的类型,肯定不存在字节序的问题了. 字节序分为哪几类? 大端字节序: 高位字节数据存放在低地址处,低位数据存放在高地址处: 小段字节序: 高位字节数据存放在高地址处,低位数据存放在低地址处: 网络字节序: TCP/IP协议传输数据时,字

大小端字节序的来历(摘自《深入理解计算机系统 第三版》)

术语“little endian(小端)”和“big endian(大端)”出自Jonathan Swift的<格列佛游记>(Gulliver's Trabels)一书,其中交战的两个派别无法就应该从哪一端(小端还是大端)打开一个半熟的鸡蛋打成一致.就像鸡蛋的问题一样,选择何种字节顺序没有技术上的理由,因此争论沦为关于社会政治论题的争论. 一下是Jonathan Swift在1726年关于大小端之争历史的描述: “......下面要告诉你的是,Lilliput和Blefuscu这两大强国在过去

大小端字节序

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

linux kernel如何处理大端小端字节序

最近在做将kernel由小端处理器(arm)向大端处理器(ppc)的移植的工作,现在kernel进入console稳定工作,基本工作已经完成,不过移植中有很多心得还是需要总结下,今天先将kernel对于大小端字节序的处理来总结下. 之前写过大小端字节序的思考,文章链接地址:http://blog.csdn.net/skyflying2012/article/details/42065427. 根据之前的理解,字节序可以认为是处理器主观的概念,就像人如何去看待事物一样,处理器分大端和小端,对于内存

内存对齐,大端字节 &nbsp; 序小端字节序验证

空结构体:对于空结构体,就是只有结构体这个模子,但里面却没有元素的结构体. 例: typedef struct student { }std: 这种空结构体的模子占一个字节,sizeof(std)=1. 柔性数组: 结构体中最后一个元素可以是一个大小未知的数组,称作柔性数组成员,规定柔性数组前面至少有一个元素. typedef struct student { int i; char arr[];     //柔性数组成员 }std: sizeof(std)=4; sizeof求取该结构体大小是

内存对齐 大端字节,序小端字节序验证

空结构体:对于空结构体,就是只有结构体这个模子,但里面却没有元素的结构体. 例: typedef struct student { }std: 这种空结构体的模子占一个字节,sizeof(std)=1. 柔性数组: 结构体中最后一个元素可以是一个大小未知的数组,称作柔性数组成员,规定柔性数组前面至少有一个元素. typedef struct student { int i; char arr[];     //柔性数组成员 }std: sizeof(std)=4; sizeof求取该结构体大小是

小端字节序与大端字节序

端模式分为:小端字节序和大端字节序,也就是字节在内存中的顺序. 小端字节序:低字节存于内存低地址:高字节存于内存高地址.如一个long型数据0x12345678 0x0029f458 0x78 0x0029f459 0x56 0x0029f45a 0x34 0x0029f45b 0x12 在以上数据存放于内存中的表现形式中,0x0029f458 < 0x0029f459 < 0x0029f45a < 0x0029f45b, 可以知道内存的地址是由低到高的顺序:而数据的字节也是由低到高的,

大端字节序和小端字节序之分

我们知道关于字节序有大端和小端之分.一般来说,Inter的处理器使用的是小端(little Indian),Moto的处理器使用的是大端.大端和小端的区别在于,内存对于变量的存放规则不同.小端存储模式是低位放在低地址,高位存放在高地址.而大端则相反. 简单示例如下: a=0x11223344: 低                                                             高 地址由低到高--------------------> 小端字节序    

【原创】大端和小端字节序的细节

这已经是一个被说得很烂的一个话题了,今天我想在这一篇文章补充一些细节上的东西,供备忘! 在看这篇文章之前,请先仔细看下链接这篇博文,关于字节序说得很详细!http://blog.chinaunix.net/uid-25367385-id-188322.html 在今天,碰到了这样一条语句: #define get16bits(d) (*((const uint16_t *) (d))) 很明显宏参数d必须是一个指针,它可以是位数大于等于16位的类型指针,short int.long int,甚至