QQ在线服务: 风舞残阳风舞残阳 年满19岁年满19岁 小罗小罗 晴天晴天 心雨心雨 叮叮肉叮叮肉 小周小周 小童小童 小破孩小破孩 遥望当年遥望当年

用户导购指南

水货IBM笔记本电脑报价

行货IBM笔记本电脑报价

IBM服务器报价

IBM笔记本电脑配件报价

本周水货IBM笔记本电脑特价

IBM笔记本电脑驱动下载

水货IBM笔记本电脑验机流程

水货IBM笔记本电脑保修政策

IBM笔记本电脑FRU查询

IBM笔记本电脑常见问题

IBM笔记本电脑使用手册

笔记本电脑验机软件

论坛积分使用说明

水货IBM笔记本电脑异地购机流程

笔记本电脑购机经历及现场

贵宾申请入口

贵宾用户FTP入口

查看笔记本配置

水货APPLE苹果笔记本电脑报价

 
发新话题
打印

[linux教程] 网络字节序的问题

网络字节序的问题

最近接触到网络字节序的概念查了查资料不是很明白先引用一段材料:
% 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使用的小端字节序其他比MOTOROLA7 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
例:0x12347 b5 G+ h! F2 G6 s0 h5 ]6 w
内存中是0x340x123 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 M6 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:25understood2 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
(※本文搜集自:重庆未来科技 http://www.wlkj.net 重庆IBM笔记本电脑、重庆IBM水货笔记本电脑、重庆苹果笔记本电脑、重庆IBM服务器专卖)

TOP

******请登陆论坛查看内容******

(※本文搜集自:重庆未来科技 http://www.wlkj.net 重庆IBM笔记本电脑、重庆IBM水货笔记本电脑、重庆苹果笔记本电脑、重庆IBM服务器专卖)
这是赤果果的灌水呐
What good would wings be
if you couldn't feel wind on your face

TOP

发新话题