MAC文本格式地址to网络字节序

#include    <sys/types.h>
#include    <netinet/in.h>
#include    <stdio.h>
 
/* 
 * Check whether "cp" is a valid ascii representation
 * of an MAC address and convert to a binary address.
 * Returns 1 if the address is valid, 0 if not.
 */
int inet_mton(const char *cp, u_char *ap)
{
	int colons = 0;
        quad_t acc = 0, addr = 0;
  
      do {
      register char cc = *cp;
  
      switch (cc) {
      case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
          acc = acc * 16 + (cc - '0');
          break;
  
      case 'a':
      case 'b':
      case 'c':
      case 'd':
      case 'e':
      case 'f':
          acc = acc * 16 + (cc - 'a' + 10);
          break;
  
      case 'A':
      case 'B':
      case 'C':
      case 'D':
      case 'E':
      case 'F':
          acc = acc * 16 + (cc - 'A' + 10);
          break;
  
      case ':':
          if (++colons > 5) {
          return 0;
          }
          /* Fall down to case '\0' */
  
      case '\0':
          if (acc > 0xFF) {
          return 0;
          }
          addr = addr << 8 | acc;
          acc = 0;
          break;
  
      default:
          return 0;
      }
      } while (*cp++) ;
  
      /* Normalize the address */
      if (colons < 5) {
      addr <<= 8 * (5 - colons) ;
      }
  
      /* Store it if requested */
      if (ap) {
      /* Convert address to network bytes order(big-endian) */
      #if __BYTE_ORDER == __LITTLE_ENDIAN 
      int i = 0, j = 0;
      for(i=0,j=5; i<6,j>=0; i++,j--){
          ap[i] = ((u_char *) &addr)[j];
      }
      #elif __BYTE_ORDER == __BIG_ENDIAN
      ap = (u_char *) &addr;
      #endif
      }
  
      return 1;
}

int main()
{ /* test inet_mton(const char *cp, u_char *ap) */         
    char *macaddr = "00:06:1B:D1:73:1F";
     u_char m_addr[6];
 
    printf("%s\n", macaddr);
    if(inet_mton(macaddr, m_addr)){
       int i = 0;
        for(i=0; i<6; i++){
            printf("%2x:", m_addr[i]);
        }
    }

     return 0;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值