最近接触到
网络字节序的概念查了查资料不是很明白先引用一段材料:
% V# j( q9 e# d! ], t- w
7 ~; e3 J5 ?$ ?7 v+ F$ @9 O字节顺序是指占
内存多于一个字节
类型的
数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节
数据存放在内存低地址处,高字节
数据存放在内存高地址处;大端字节序是高字节
数据存放在低地址处,低字节
数据存放在高地址处。基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。因而对int、uint16、uint32等多于1字节类型的
数据,在这些嵌入式平台上应该变换其存储顺序。通常我们认为,在空中传输的字节的顺序即网络字节序为
标准顺序,考虑到与协议的一致以及与同类其它平台产品的互通,在
程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络字节序转换为主机字节序。
# p1 w$ _# _. E; B3 |. f% L F8 e9 B
' I; i5 X8 g% w5 O: A3 ~7 h) X在本LINUX的书里介绍到INTEL的
CPU使用的小端字节序其他比MOTOROLA
7 G+ s3 W2 p* A6 g
68000系列CPU使用的是大端字节序如果不转换将数据通过网络发出时比如MOTOROLA发一个16位数据:0X1234传送到INTEL时
, g! Q" U! U9 u9 |, F& U
就被INTEL解释为0X3412也就是4660成了13330所以有时候需要一些函数来进行大小端字节序的转换
4 Z1 E3 D+ G d) B$ m( }8 s8 w: N7 O, {' |1 J2 C
6 s& L- X5 _+ T" g
1 p T( p# G8 u. z$ @1 E7 y; }关于这大小字节序的概念不是很想的明白数据在
( P0 a# M/ _/ I7 B内存里是具体怎么存放的形式?为什么会有CPU解释的不同?数据不是按12345678……这样的顺序一直排列的么?希望大人赐教谢谢
7 x6 @) a) l* {% X8 o3 n# F[color=#FFFFFF']
. a7 W2 U/ F' o' i$ T
3 @% }/ g9 p; H* U* U9 C
; p& l2 C; M1 X. P( o
xuechao回复于:2003-11-2017:11:57没人顶吗?各位给条路啊
# ]4 i8 H1 G: P8 I% W$ o8 o
6 P3 x) W; \6 s5 y* E& @
流氓无产者回复于:2003-11-2018:57:00不就是大小印地安记法吗
6 j# [9 a3 W) ]9 ]0 q
1)从低到高存(liittleedian)
7 M; V8 K+ F9 A9 o7 ]+ N
例:0x1234
7 b5 G+ h! F2 G6 s0 h5 ]6 w
内存中是0x340x12
3 n8 y% `% v0 U _
2)从高到低存(bigedian)
* A9 V4 i" a9 @$ ~0 Z0 \( F% H0 E! D例:0x1234
) S3 m. E* G# d" d" Z9 s1 i7 N
内存中是0x120x34
5 W0 y7 c, X5 u( ~2 a$ p; ?2 ?+ S
sky-walker回复于:2003-11-2019:43:46如:一个多字节值0xFECDBA98,内存从地址100开始存放
8 ?% B# w8 r$ L4 Q D2 R) A) F) w5 e7 r
降序:FE│CD│BA│98----%26gt;对应地址100│101│102│103
' Y: u& C8 @1 J/ y2 }8 {, j0 p$ Y" F U5 s
升序:98│BA│CD│FE----%26gt;sameabove
% t% Q2 j7 B/ Z$ s+ R
" u3 k8 D* W% Z# v V注意,我们的书写表示法是从低字节位---%26gt;高字节位
7 u! j2 L6 o9 s7 V. b# R! S; s) ~% C
5 B& A- Q% Y$ o$ w! |8 a; g
3 }5 K! o9 R/ S/ c
至于为什么CPU解释不同,可能是由于不同的体系构架在起始竞争时人为地制造
$ e/ X ?% c- |% G) |' M9 \ h4 q( a0 Z& H) Y
和对手不兼容性......害的我们这么惨,一遇到移植就要注意这个:twisted:
7 e0 v0 Y4 [& g O0 B+ T
/ Z9 W/ C7 V$ d) z+ r8 `% LC代码的移植相对简单原因之一就是由于C的连续存储数据永远保持从低地址到高
+ U/ p1 X: [: Y9 A! {
* l. l) P/ I1 h) V地址的索引........
! y4 P! {- O# B3 }
! @3 J, i8 V3 s% u Z) h3 h0 lxuechao回复于:2003-11-2022:32:27小端字节序就是升序排列那种?
$ c! ~0 X# k7 q. S4 g我们的书写表示法是从低字节位---%26gt;高字节位这个是什么意思呢?难道FECDBA98是从低到高(从左到右)吗?
$ C3 [6 U$ d' n3 L
: ~; v) y4 m. Y, C4 Y还有它排列是按单个字节来还是按数据类型的?比如说是INT型就按两个两个排就象0X1234和0X3412而不是0X1234和0X4321?
' R4 p. D' e4 @' Z- [" U% _5 f5 N; S
5 @9 x# ~3 |! ]. q1 x, |sky-walker回复于:2003-11-2023:32:56"我们的书写表示法是从低字节位---%26gt;高字节位这个是什么意思呢?难道FECDBA98是从低到高(从左到右)吗?"
: M9 f$ {$ D' j' n7 T
1 u+ ?$ |4 e- s" I7 E, Z3 M否
6 e! k5 D' c ?
. e7 d6 X" f2 w- Y1 z) D: O- t3 f9 g( a' s7 F+ o; I
"还有它排列是按单个字节来还是按数据类型的"
1 k. G+ t4 g: f: V' Q: E' G' U8 v: Z: v2 z! ^# J4 X, T" N
对于多字节数据才有这么一出
; Q) q$ N8 P0 B2 _! r3 h& L) H Z' }
$ M+ S1 _4 q5 [2 }. [. i这样理解吧
; c! A1 [. @, s0 U. a7 i/ [. a+ Q( v
譬如:
3 V8 |9 m) \7 F8 H) C) T% [2 z
内存地址生长方向为:从左到右由低到高(这是不变的)
& Y2 q" s: {/ m. ` S
* f- W; q' s. M% w- U& Y数据为:0x89ABCDEF
' J l4 c& y$ L& [( c
. G" G3 K' I+ P7 B! X$ a& ]降序(Big-endian)大端字节序存储时由左到右
! i* z) t; f x
7 N0 A" y2 D& q) m8 M- ~
升序(Little-endian)小端字节序存储时由右向左
. ?5 A& Q0 `( }& @! r6 y9 k
0 z3 t) O+ e7 [1 B可以自己编一个小程序验证一下(用C的数组)
, T: O- K% ]) ?. z3 V! A- ]$ |
. Y6 e4 k. C, f/ f/ T7 s0 Q6 y% x
更简单的调用
VC里的checkEndian()
6 f4 ?/ q1 {' Y V1 `6 R& K+ K0 o2 b3 B
xuechao回复于:2003-11-2113:22:25understood
2 Y# L% r/ G' C4 e4 }
thanx!!
& ?! v* [; J' B* J% ?' t4 b5 O
) k) N1 p* a; n' b4 A+ V, Pwqch回复于:2004-04-2715:05:29关于网络字节序和主机字节序的转换ytjia(原作)关键字网络字节序,Socket主机和网络字节序的转换最近使用C#进行网络开发,需要处理ISO8583报文,由于其中有些域是数值型的,于是在传输的时候涉及到了字节序的转换。字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有两种字节顺序,根据他们所处的位置我们分别称为主机节序和网络字节序。通常我们认为网络字节序为标准顺序,封包的时候,将主机字节序转换为网络字节序,拆包的时候要将网络字节序转换为主机字节序。原以为还要自己写函数,其实网络库已经提供了。主机到网络:short/int/longIPAddress.HostToNetworkOrder(short/int/long)网络到主机:short/int/longIPAddress.NetworkToHostOrder(short/int/long)主机字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处,如:intx=1;//此时x为主机字节序:[1][0][0][0]低位到高位inty=65536//此时y为主机字节序:[0][0][1][0]低位到高位我们通过主机到网络字节序的转换函数分别对x和y进行转换得到他们对应的网络字节序值,网络节序是高字节数据存放在低地址处,低字节数据存放在高地址处,如:intm=IPAddress.HostToNetworkOrder(x);//此时m为主机[[color=red:4d5c53bbac]改为网络[/color:4d5c53bbac]]字节序:[0][0][0][1]高位到低位intn=IPAddress.HostToNetworkOrder(y);//此时n为主机[[color=red:4d5c53bbac]改为网络[/color:4d5c53bbac]]字节序:[0][1][0][0]高位到低位经过转换以后,我们就可以通过byte[]btValue=BitConverter.GetBytes(m);得到一个长度为4的byte数组,然后将这个数组设置到报文的相应位置发送出去即可。同样,收到报文后,可以将报文按域拆分,得到btValue,使用intm=BitConverter.ToInt32(btValue,0);//从btValue的第0位开始转换得到该域的值,此时还不能直接使用,应该再用网络到主机字节序的转换函数进行转换:intx=IPAddress.NetworkToHostOrder(m);这时得到的x才是报文中的实际值。第一次用C#做项目,也是第一次发文,恐难入众高手法眼,恳请不吝赐教。http://www.csdn.net/Develop/read_article.asp?id=27097