关于网络字节流和主机字节流,内存赋值

Big-endianlittle-endian是描述排列存储在计算机内存里的字节序列的术语。

Big-endian(从左到右的习惯方式)是一种大值的一端(序列中更典型值)存在前面(在最小的存储地址)的顺序。Little-endian是一种小值的一端(序列中较不典型的值)存储在前的顺序。比如,在Big-endian的电脑中,需要两个字节把十六位数4F52当作4F52存在存储器中(如果4F存在存储地址1000中,比如说,52将存在1001中)。在little-endian系统里,将被存为524F52存在存储地址1000中,比如说,4F将存在1001中)。

Big-endian 的机器有:IBM370主机,Motorola的微处理器,TCP/IP也使用big-endian方法,moto68K系列和decsparc

Little-endian的机器有:Intel处理器(CPUs)和DEC Alphas和至少一些在他们的平台的其他程序

Big-Endian  Little-Endian 字节排序 
  
字节排序                  含义 
Big-Endian    
一个Word中的高位的Byte放在内存中这个Word区域的低地址处。 
Little-Endian  
一个Word中的低位的Byte放在内存中这个Word区域的低地址处。

必须注意的是:表中一个Word的长度是16位,一个Byte的长度是8位。如果一个数超过一个Word的长度,必须先按Word分成若干部分,然后每一部分(即每个Word内部)Big-Endian或者Little-Endian的不同操作来处理字节。 

如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为 
           big-endian   little-endian 
0x0000      0x12        0xcd 
0x0001      0x34        0xab 
0x0002      0xab        0x34 
0x0003      0xcd        0x12 

  对网络数据包的处理,接收到网络数据包,根据字节顺序进行存储,需要在网络字节顺序和主机字节顺序之间进行转换,c语言中提供的转换函数有:

#include <arpa/inet.h>

uint32_t ntohl(uint32_t netlong);  netlong:一个以网络[字节顺序表达的32位数。

uint32_t htonl(uint32_t hostlong);  hostlong:主机字节顺序表达的32位数。

u_short  htons( u_short hostshort);  hostshort:主机字节顺序表达的16位数。

uint16_t ntohs(uint16_t netshort);  函数将一个32位数从主机字节顺序转换成网络字节顺序。


对内存赋值函数

#include <string.h><cstring>

void *memset(void *s,int ch,size_t n); 将s中前n个字节用ch替换并返回s;
void *memcpy(void *dest, const void *src, size_t n);   
从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值