判断主机、网络字节序和互相转换

大端字节序(big-endian):按照内存地址的增长方向,高位数据储存于低位地址。

小端字节序(little-endian):按照内存地址增长方向,高位数据储存于高位地址。

判断主机、网络字节序:

#include <stdio.h>#include <arpa/inet.h>

int main(void)

{

  unsigned short int h = 0x1234;
  unsigned short int n;
  if (*((unsigned char *)&h) == 0x12) {

    printf("big-endian\n");
  }

  if (*((unsigned char *)&h) == 0x34) {

    printf("little-endian\n");
  }
  n = htons(h);  if (*((unsigned char *)&n) == 0x12) {    printf("big-endian\n");
  } else {    printf("little-endian\n");
  } 
  return 0;
}

或者:

#include <stdio.h>
#include <arpa/inet.h>  

int main(){
    unsigned long a = 0x12345678;
    unsigned char *p = (unsigned char *)(&a);
    printf("主机字节序:%0x    %0x   %0x   %0x\n",  p[0], p[1], p[2], p[3]);  

    unsigned long b = htonl(a);  //将主机字节序转化成了网络字节序  

    p = (unsigned char *)(&b);  

    printf("网络字节序:%0x    %0x   %0x   %0x\n",  p[0], p[1], p[2], p[3]);
      return 0;
} 结果:  主机字节序:78 56 34 12  网络字节序:12 34 56 78

转化:

include <stdio.h>
#include <arpa/inet.h>  

int main()
{
    struct in_addr ipaddr;
    unsigned long addr = inet_addr("192.168.1.100");
    printf("addr = %u\n", ntohl(addr));  

    ipaddr.s_addr = addr;
    printf("%s\n", inet_ntoa(ipaddr));
    return 0;
} 结果:  addr = 3232235876  129.168.1.100

参考:http://blog.csdn.net/msdnwolaile/article/details/50727653

主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs     网址:http://blog.csdn.net/kulala082/article/details/53431473

原文地址:https://www.cnblogs.com/coolYuan/p/8350727.html

时间: 2024-08-09 15:57:27

判断主机、网络字节序和互相转换的相关文章

【UNIX网络编程(一)】套接字地址结构、网络字节序和地址转换函数

引言:套接字地址结构在网络编程的每个实现中都要用到,因此掌握套接字地址结构是以后编写网络程序的前提,地址结构可以在两个方向上传递:从进程到内核和从内核到进程.地址转换函数在地址的文本表达和他们存放在套接字地址结构中的二进制值之间进行转换. 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数.不同协议都有自己的套接字地址结构.通用的套接字地址结构是sockaddr.IPv4套接字地址结构是定义在头文件<netinet/in.h>中的sockaddr_in,其POSIX定义如下: stru

Linux 网络编程——网络字节序、地址转换

网络字节序 故事的起源 "endian"这个词出自<格列佛游记>.小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位. 我们一般将"endian"翻译成"字节序",将 Big-Endian 和 Little-Endian 称作"大端格式"和"小端格式". 字节序 字节序是指多字节

主机字节序和网络字节序转换

为什么要转换? 主机字节序:整数在内存中保存的顺序,不同的处理器对应不容的模式 Little endian 将低序字节存储在起始地址 Big endian    将高序字节存储在起始地址 网络字节序:整数在网络中的发送顺序 网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型.操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释. 网络字节顺序采用big endian排序方式 htons 本地的无符号short型主机字节序转换为网络字节序 htonl    

linux程序设计——主机字节序和网络字节序(第十五章)

15.2.10    主机字节序和网络字节序 当在基于intel处理器的linux机器上运行新版本的服务器和客户程序时,可以用netstat命令查看网络连接状况.它显示了客户/服务器连接正在等待关闭.连接将在一段超时间之后关闭,如下所示: 可以看到这条连接对应的服务器和客户的端口号.local address一栏显示的是服务器,而foreign address一栏显示的是远程客户(即使是在同一台机器上,它仍然是通过网络连接的).为了确保所有套接字都是不同的,这些客户端口一般都与服务器监听套接字不

c# 主机和网络字节序的转换 关于网络字节序和主机字节序的转换

最近使用C#进行网络开发,需要处理ISO8583报文,由于其中有些域是数值型的,于是在传输的时候涉及到了字节序的转换. 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有两种字节顺序,根据他们所处的位置我们分别称为主机节序和网络字节序. 通常我们认为网络字节序为标准顺序,封包的时候,将主机字节序转换为网络字节序,拆包的时候要将网络字节序转换为主机字节序. 原以为还要自己写函数,其实网络库已经提供了. 主机到网络:short/int/long IPAddress.HostToNet

第五篇:主机字节序与网络字节序的转换

前言 我们知道,数据在主机内的存放有两种模式,也就是说,主机字节序有两种:大端和小端( 这里假定读者已经清楚这个问题 ).但在网络通信中,要求通信数据( 通信数据这里指IP号和端口号 )的使用必须用网络字节序.什么又是网络字节序? 网络字节序可以理解为主机字节序的大端模式.如果你的主机字节序原本就是大端模式,那么你可以考虑不用将通信数据转换为网络字节序:但如果你的主机字节序是小端,那么通信数据必须被下面提及到的其中某个函数进行处理,转换成网络字节序后方可使用( 即存放进套接字地址结构变量 ).

网络字节序与主机字节序的转换

在对IP地址结构体SOCKADDR_IN赋值的时候,经常会用到下列的函数htonl,htons,inet_addr,与之相对应的函数是ntohl,ntohs,inet_ntoa.查看这些函数的解析,会发现这些函数其实是与主机字节序和网络字节序之间转换有关.就是什么网络字节序,什么是主机字节序呢?下面我写出他们之间的转换: 用IP地址127.0.0.1为例: 第一步   127     .         0         .         0         .        1      

主机字节序与网络字节序的转换:ntohl()与htonl()

#!/usr/bin/env python #coding=utf-8 import socket def convert_integer(): data=1234 #32-bit print "Original: %s => Long host byte order: %s, Network byte order: %s" %(data,socket.ntohl(data),socket.htonl(data)) #16-bit print "Original: %s

网络字节序与主机字节序

最近在项目开发过程中,需要在采用JAVA作为语言的服务器与采用C++作为语言的服务器间进行通信,这就涉及到这两种语言间数据类型的转换以及网络字节序与主机字节序的区别.该文主要说说网络字节序和主机字节序的区别以及Little endian与Big endian的概念.其实编程的事就比较简单了   我也懒得写了,直接引用了我觉得写的挺好的两篇文章: 什么是Big Endian和Little Endian? 来源:http://blog.ednchina.com/qinyonglyz/194674/m