• char 数组和 int 之间转化


      上周工作结束,来到斯凯网络也将近半个月来。 没有新人的感念,最多的是将自己当作一个战士。

         废话不多说,直接入正题,在没有仔细考虑问题之前我们总会 觉得:这尼玛的有毛线难度啊,不就是一个 int 转为char吗,直接把int 转化成string 然后打散不久可以了啊。  这个方案真的可以吗??

         我们若再仔细思考下,比如说将 1 转化为 “1”,12 转化为 “12”, 这样就可以了吗?

         但是我要问一个问题,这样用系统函数转化过程是很方便很简单,但是有谁知道转化过程中到底做了什么呢,假如要你自己写你会考虑到哪些呢?  对于一个C# 程序员来说,其实比较悲哀的一件事情是:我们一开始的固定思维是:int  转string 不就是一个 int a; a.toString() 的事情吗! 还有什么啊。。。压根没东西啊!  (本人以前也是开发C#的 哈哈!) 。  

                  在这里我也深深的体会到C 的重要,以及为什么说C 的门槛高,而C#的门槛低。(本人自从学习objective-c之后也温习了不少C 知识唷 哈哈)

                  答案很简单:做同样一件事情理解的深度是完全不一样的。    

                  若是C 开发者则会反问C#:"啊?String类型在我们这里压根没有啊。再怎么说 string类型也无非是 char 的集合啊。所以将string 拆分开来也无非是 char。 因此对上面提出的12 转化为 ’12’  我就有个疑问:一个12 整数为什么要两个char? 若是三位数呢,则需要三个char?但是有一个很严重的问题是你有没有考虑过:在内存中 一个int 是需要4个字节,而一个char 只需要一个! 另外一个很重要的感念就是,在char 字符串家族中 他们是满足ASCII 码规范的。因此我们刚才提到的 ’1‘ 压根在内存结构中和 int 1 是完全不同的。"

                针对上面的种种疑问,所以我们把问题也稍微理清下把问题描述理解为:”在内存结构不变的情况下,怎样将int 数据存储在char中!“

          先列出 int 1内存数据:0x00000001;(注意:char‘1’ 内存数据是:00110001--0x31)

         所以我们可以将一个int 类型拆分4个char ;当然也就是:char[0] -0x00;char[1]-0x00;char[2]-0x00;char[3]-0x01; 

          哦,到这 为止,我们终于弄明白了!原来是这样啊,但是怎么样实现呢? 在程序的世界里要深刻理解一件事情就是:再我们逻辑上看起来很简单的事情,而在计算机世界都是不可想像的。。。。。

         呵呵,代码如下:

        @define BYTELENGTH 8;//8 bit 为一个字节

    -(void) int2BytesWithValue:(int) value withByteLength: (int) byteLength withResult:(char*) result

    {

        int shiftCount=0;

        for (int i=0; i<byteLength; ++i) {

            shiftCount=(byteLength-1-i)*BYTELENGTH;

            result[i]= (char)((value&(0x000000ff<<shiftCount))>>shiftCount);//注意 这里0x000000ff, 必须的不然结果可能会不一致

        }

    }

    //同样这里我也写出将 char* 反转化为int 类型吧。希望不要将C# 高级的思想所钝化。

    -(int) bytes2IntWithValue:(char*) bytes withByteLength:(int) byteLength

    {

        int result=0;

    //   NSLog(@"int Length:%lu",  sizeof(int));

        for (int i=0; i<byteLength; ++i) {

             //这里若不 同或&0x000000ff 会出现意想不到的结果

            int temp=(int)((bytes[i]&0x000000ff)<<((byteLength-1-i)*BYTELENGTH));

             result|= temp;

        }

        return result;

    }

      到此为止我才会说有所思考的说:“嗯, 这就对了!这是我想要的。。。。原来我以前一直不知道啊!还是谦虚点好啊!”;

  • 相关阅读:
    C到C++的升级
    设计模式分类
    对模式的十大误解
    MAC帧和IP包的分析
    python之路—从入门到放弃
    选课系统
    Scrapy框架详解
    爬虫系列
    Python从入门到断气
    常用模块
  • 原文地址:https://www.cnblogs.com/kingbo/p/3905591.html
Copyright © 2020-2023  润新知