【转】[c/c++ ]字节序与大小端转换--不错

原文网址:http://blog.csdn.net/kuai0705/article/details/20841133

注明: 以下内容均为学习内容整理,记录,便于自己学习,并非完全意义上的自产,如有感到不适,请联系我

一.多字节值及字节序

1.brief

现在有一个数字 65430,这个数字在二进制的内存中一个字节无法完全存下,存储这个数字需要1个字节以上的空间。这样的值被称为多字节量(multi-byte quantity)。

65430在内存中由两个字节表示:0xFF 和 0x96 ,其中:

0xFF被称为最高有效字节(most significant byte, MSB)

0x96 被称为最低有效字节(last significant byte, LSB)

在内存中存储这样的多字节整数有两种方式

大端:最高有效字节存储在较低的内存位置

such as:

0x0->0xFF

0x1->0x96

小端:最低有效字节存储在较低的内存位置

such as:

0x0->0x96

0x1->0xFF

2.整数字节序转换

整个过程从该值的MSB和LSB开始交换,直到交换至该值的中间点,唯一的难点在于,由于不能简单的把对象(结构型数据)转换为字节数组去用单一的通用函数转换字节,所以需要知道哪些字节序需要转换,例如 把内存中的struc或class写入文件时,要正确的转换字节序,便需要知道其中每个数据成员的位置及大小,并基于每个成员的大小逐一进行适当的转换

[cpp] view plaincopy

  1. //对应int32大小的成员 的转换 范例
  2. int32_t swapInt32(int32_t value)
  3. {
  4. return ((value & 0x000000FF) << 24) |
  5. ((value & 0x0000FF00) << 8) |
  6. ((value & 0x00FF0000) >> 8) |
  7. ((value & 0xFF000000) >> 24) ;
  8. }

3.浮点数字节序转换

浮点数的内部结构相对比较复杂,但仍然可以把浮点数当作整数转换字节序,因为字节始终是字节,可以使用c++的reinterpret_cast操作把浮点数诠释为整数,这称为类型双关(type_punning),或者使用一个简便的方法是 使用union

[cpp] view plaincopy

  1. union intWithFloat
  2. {
  3. int32_t m_i32;
  4. float m_f32;
  5. }
  6. float swapFloat32(float value)
  7. {
  8. intWithFloat i;
  9. i.m_i32 = value;
  10. i.m_f32 = swapInt32(i.m_i32)
  11. return i.m_f32;
  12. }
时间: 2024-10-10 15:08:43

【转】[c/c++ ]字节序与大小端转换--不错的相关文章

字节序与大小端

为什么会有字节序问题 1. 内存以8bit为一个地址单位:早期的处理器地址以8bit为一个单位(8位处理器),也就是说一次可以访问8bit的数据,后来出现了16位,32位甚至64位的处理器,但为了兼容最早的8位处理器,因此沿用8bit为一个地址单位. 2. 大于8位的处理器,如32位处理器,虽然每个8bit(一个字节)存储数据的方式是一样的,但是针对整形这样的有多个字节的数据结构的数据,每个字节内存储数据方式相同,但字节间(即几个字节的顺序)存储方式不同. 3.其他历史原因. 不同的处理器结构对

java整型数与网络字节序的 byte[] 数组转换关系

java整型数与网络字节序的 byte[] 数组转换关系 工作项目需要在java和c/c++之间进行socket通信,socket通信是以字节流或者字节包进行的,socket发送方须将数据转换为字节流或者字节包,而接收方则将字节流和字节包再转换回相应的数据类型.如果发送方和接收方都是同种语言,则一般只涉及到字节序的调整.而对于java和c/c++的通信,则情况就要复杂一些,主要是因为java中没有unsigned类型,并且java和c在某些数据类型上的长度不一致. 本文就是针对这种情况,整理了j

(四十七)socket编程——socket引入、网络字节序、IP地址转换函数、sockaddr数据结构介绍

一.什么是socket socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,为TCP/

理解字节序 大端字节序和小端字节序

1. 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian). 举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11. 大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法. 小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存. 同理,0x1234567的大端字节序和小端字节序的写法如下图. 2. 我一直不理解,为什么要有字节序,每次读写都要区分,多麻烦!统一使用大端字节序,不是更方便吗?

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

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

大端字节序和小端字节序

不同的系统,对于存储的内容的高字节,可能分别放在物理地址的高地址或低地址. 我们可以简单地将内存看成是线性的连续地址. 对于高字节存放在低地址的字节序,称为大端字节序.网络字节序就是大端字节序. 反之,高字节存放在低地址的字节序,称为小端字节序. bool isLittleEndian() { int i = 1; char *a = (char*)&i; return *a;// 若true 小端字节序:反之 大端字节序 } 例子: #include <iostream> using

字节顺序与大小端

1.概念: 1)小端:操作数的存放方式是高地址存放高字节. 0x1234,存放地址为0x2000 内存地址 存放内容 0x2000 0x34 0x2001  0x12 2)大端:操作数的存放方式是高地址存放低字节.    0x1234,存放地址为0x2000 内存地址 存放内容 0x2000 0x12 0x2001  0x34 x86平台采用的是小端模式,网络字节顺序是大端模式. 2.检测系统大小端 1)调用库检测 1 #include<endian.h> 2 #include<stdi

编程判断大端字节序和小端字节序

代码一:联合体union的存放顺序是所有成员都从低地址开始存放,若处理器是Big_endian(从高字节到低字节存放数据)的,则返回0:若是Little_endian(从低字节到高字节存放数据)的,则返回1. int checkCPU() { union w { int a; char b; } c; c.a = 1; return (c.b == 1); } 代码二: #include <stdio.h> #include <stdlib.h> int main() { int

检查机器是大端字节序还是小端字节序

#include<stdio.h>int check_sys(){ int a = 0x11223344; char *p = (char *)&a; if (*p == 0x11)  return 1; if (*p==0x44)  return 0;}int main(){ int ret; ret = check_sys(); if (ret == 1)  printf("big\n"); if (ret == 0)  printf("little\