博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大小端以及字节序的问题
阅读量:5340 次
发布时间:2019-06-15

本文共 2844 字,大约阅读时间需要 9 分钟。

网络字节顺序NBO(Network Byte Order):按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。

The order in which the  of a multi-byte number are transmitted on a network - most significant byte first (as in "" storage). 

 

 

主机字节顺序(HBO,Host Byte Order):不同的机器HBO不相同,与CPU设计有关计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先。

 C#中可以通过BitConverter.IsLittleEndian

Console.WriteLine("BitConverter.IsLittleEndian = {0}", BitConverter.IsLittleEndian);

 

 

 

需要注意的是无符号的整型

uint a=3758205120;  

从下图可以看出最高位的字节是 1110 0000 是没有符号位的

 

namespace System.Net

public class IPAddress

{

public static int HostToNetworkOrder(int host);

public static long HostToNetworkOrder(long host);

public static short HostToNetworkOrder(short host);

}

IPAddress中处理的都是有符号的

 

int d=2147483647;  //2^31-1

//d=2147483648;  //int的取值不能超出2147483647,这个赋值溢出了

但是uint就可以赋值:  uint d = 2147483648;

 

 

===2015年09月23日更新===

字节数组的高低位问题

Console.WriteLine("BitConverter.IsLittleEndian = {0}", BitConverter.IsLittleEndian);                const int number = 0x01020304;                Console.WriteLine("0x01020304 = {0}", number);                var array = BitConverter.GetBytes(number);                int index = -1;                foreach (byte b in array)                {                    index++;                    Console.WriteLine("array[{0}] = 0x{1}", index, b.ToString("x2"));                }

输出结果是:

BitConverter.IsLittleEndian = True

0x01020304 = 16909060
array[0] = 0x04
array[1] = 0x03
array[2] = 0x02
array[3] = 0x01

0x01020304对应4字节的数字16909060,二进制为  0000 0001,0000 0010,0000 0011,0000 0100

4个字节从高到低: 最高位是0000 0001   最低位是0000 0100

BitConverter.GetBytes(number);

 经过BitConverter.GetBytes获取的字节数组,下标小的对应于最低位

 

 

Console.WriteLine("BitConverter.IsLittleEndian = {0}", BitConverter.IsLittleEndian);                var result = int.MaxValue.ToString("X");                Console.WriteLine(result);//Result: 7FFFFFFF                result = BitConverter.ToString(BitConverter.GetBytes(int.MaxValue));                Console.WriteLine(result); //Result: FF-FF-FF-7F

输出结果:

BitConverter.IsLittleEndian = True

7FFFFFFF
FF-FF-FF-7F

解答:

int.MaxValue.ToString("X") outputs 7FFFFFFF, that is, the number 2147483647 as a whole.

On the other hand, BitConverter.GetBytes returns an array of bytes representing 2147483647 in memory. On your machine, this number is stored in little-endian (highest byte last). And BitConverter.ToString operates separately on each byte, therefore not reordering output to give the same as above, thus preserving the memory order.

However the two values are the same : 7F-FF-FF-FF for int.MaxValue, in big-endian, and FF-FF-FF-7F for BitConverter, in little-endian. Same number.

 

 

字节序的高低位
高位和低位,参看计算器-->程序员,左高右低
比如0x0102 两个字节 01是高位,02是低位
小端字节序:高位在高地址,低位在低地址
大端字节序:高位在低地址,低位在高地址

192.168.1.224

小端字节序:0xc0a801e0 对应数字3232236000
大端字节序:0xe001a8c0   假如按照小端来解析数字的话是3758205120,按照大端来解析首先反转,然后再解析会是3232236000

转载于:https://www.cnblogs.com/chucklu/p/4818319.html

你可能感兴趣的文章
HAL层三类函数及其作用
查看>>
Odoo 去掉 恼人的 "上午"和"下午"
查看>>
web@h,c小总结
查看>>
java编程思想笔记(一)——面向对象导论
查看>>
Data Structure 基本概念
查看>>
Ubuntu改坏sudoers后无法使用sudo的解决办法
查看>>
NEYC 2017 游记
查看>>
[搬运] 写给 C# 开发人员的函数式编程
查看>>
Python之旅Day14 JQuery部分
查看>>
core--线程池
查看>>
redux-effect
查看>>
Swift和OC混编
查看>>
Android轻量级的开源缓存框架ASimpleCache
查看>>
他山之石:加载图片的一个小问题
查看>>
shell - 常识
查看>>
mssql sqlserver 使用sql脚本 清空所有数据库表数据的方法分享
查看>>
分层图最短路【bzoj2763】: [JLOI2011]飞行路线
查看>>
linux下编译复数类型引发的错误:expected unqualified-id before '(' token
查看>>
codeforces 1041A Heist
查看>>
字典常用方法
查看>>