zoukankan      html  css  js  c++  java
  • "二进制" 转化为 "十六进制

    //"二进制" 转化为 "十六进制"

    void To_string(uint8 *dest,char * src,uint8 length)

    {

      uint8 * xad;

      uint8 i = 0;

      uint8 ch;

      xad = src + length - 1;

      for(i=0;i<length;i++,xad--)

      {

        ch = (*xad>>4)&0x0F;//除以16

        dest[i<<1] = ch + ((ch<10)?'0':'7');

        ch = *xad & 0x0F;

        dest[(i<<1)+1] = ch + ((ch<10)?'0':'7');

      }

    }

    void To_string(uint8 *dest,char *src,uint8 length) 
    {
    uint8 *xad;
    uint8 i = 0;
    uint8 ch;
    xad = src + length - 1;//xad现在指到了src数组的最后一个位置(倒着来是因为符合intel小端存储的规范)
    for(i = 0;i < length;i++,xad-- )
    {
    ch = (*xad >> 4) & 0x0F; //xad所指位置处的值右移四位再取后四位存到ch中,即把xad所指的字节的高四位存到ch中
    dest[i<<1] = ch + (( ch < 10) ? '0' : '7' );
    把刚才的到的ch转为十六进制存放到dest地址对应的偏移为2i的地方(i左移1位就是i*2)
    为什么是2*i呢,显然这里是用一个字节来存储一个数;原来的一个char 化成二进制是8位,每四位对应一个16以内的数
    ch = *xad & 0x0F;//把xad所指位置处的值取低四位存到ch中
    dest[(i<<1) + 1] = ch + (( ch < 10 ) ? '0' : '7' );
    把刚才的到的ch转为十六进制存放到dest地址对应的偏移为2i+1的地方
    (ch + (( ch < 10 ) ? '0' : '7' );//9以内直接存,10-15需要存成A-F,加‘7’即加上37(字符‘7’的asll值),刚好就能对应到A-F,可以查一下asll表)

    }
    整个函数就实现了把一个内存中初始地址src,长度为length的值(按照其意图来看应该是字符串)转为一个16进制的数来存到dest所指的一片内存区域中;
    如果你对这些数据类型和内存的小端方式了解,相信我的解释已经够详细了,如果你自己对这些内存操作基础并不好,那说起来就比较费劲了;

  • 相关阅读:
    AS3 判断双击事件
    php 数据类型转换与比较
    几行几列算法
    CCNode的属性说明
    bitmapdata的知识点
    addFrameScript用法
    TweenMax.allTo
    flash TweenMax用法
    flash流媒体资料
    c实现windows socket
  • 原文地址:https://www.cnblogs.com/liushao/p/6354464.html
Copyright © 2011-2022 走看看