V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
soratadori
V2EX  ›  C++

这段 c++代码啥意思?

  •  
  •   soratadori · 2017-04-11 05:45:58 +08:00 · 3783 次点击
    这是一个创建于 2785 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我不会 c++,抄一段程序抄到最后发现看不懂了。

    Buffer 是一段 bytes ,由 fread 读取文件的某部分获得

     for(unsigned int i=0; 10; i++){
         unsigned char sample[4];
         *(unsigned int*)sample = *((unsigned int*)Buffer+i);
         sample[1] sample[2] balabala
    }
    

    等号右边是怎么变成数组的..

    第 1 条附言  ·  2017-04-11 15:15:21 +08:00
    死循环?是因为 (unsigned int i=0; 10; i++) 吗?
    原来写的是 unsigned init i=0; i<10; i++ 哈哈哈...
    第 2 条附言  ·  2017-04-11 17:09:43 +08:00
    已经搞定了,谢谢各位,尤其是谢谢一楼
    21 条回复    2017-04-14 02:38:32 +08:00
    Valyrian
        1
    Valyrian  
       2017-04-11 05:51:39 +08:00
    每次把 4 byte 的的内容从 buffer 复制到 sample
    soratadori
        2
    soratadori  
    OP
       2017-04-11 06:04:24 +08:00
    @Valyrian
    thanks
    wolegequ
        3
    wolegequ  
       2017-04-11 06:12:39 +08:00 via Android
    都不睡的吗
    lany
        4
    lany  
       2017-04-11 07:56:46 +08:00
    先是把 buffer 转成 unsigned int 型的指针,指针+1 就是指针+1 个 int ;于是循环 10 次不停+1 ,变成了改数组下标一样了。
    abscon
        5
    abscon  
       2017-04-11 08:13:04 +08:00 via iPhone
    @lany 你确定是循环十次?
    lany
        6
    lany  
       2017-04-11 08:14:13 +08:00
    @abscon for 里面不是写了 10 么?难道我错了?我有点凌乱。。。
    hanxiV2EX
        7
    hanxiV2EX  
       2017-04-11 08:26:11 +08:00 via iPhone
    读取 10 个整数
    zwzmzd
        8
    zwzmzd  
       2017-04-11 08:31:25 +08:00 via iPhone
    看样子是分离 unsigned int 的每一位,一共处理了 10 个 unsigned int
    araraloren
        9
    araraloren  
       2017-04-11 08:37:52 +08:00
    @lany 是写了个 10 。。
    估计是写错了。。
    sundev
        10
    sundev  
       2017-04-11 08:43:35 +08:00
    4 个无符号 char 强制转换为 无符号 int
    里面的代码好理解, for 循环条件写错了?还是我孤陋寡闻!
    zh5e
        11
    zh5e  
       2017-04-11 09:02:06 +08:00
    死循环了
    wizardoz
        12
    wizardoz  
       2017-04-11 09:13:36 +08:00
    请问 blablabla 的地方干了什么?
    如果没有合理的理由我觉得这个代码写的不太好,如果想转字节序我会选择用 hton 和 ntoh 函数,毕竟直观的多。
    aleen42
        13
    aleen42  
       2017-04-11 09:13:40 +08:00
    2333 循环给弄死了
    wizardoz
        14
    wizardoz  
       2017-04-11 09:16:52 +08:00
    @wizardoz 如果是教材上的例子就可以理解,目的是为了说明指针的用法。指针是内存地址,同一个内存区域,访问出的数据是什么格式取决于你用那种类型的指针去访问他。
    stormpeach
        15
    stormpeach  
       2017-04-11 09:27:06 +08:00
    死循环了,抄错了?
    lrh3321
        16
    lrh3321  
       2017-04-11 09:28:55 +08:00
    死循环了 +1
    psklf
        17
    psklf  
       2017-04-11 10:14:09 +08:00
    循环写清楚 blabla 建议也写一下 好弄明白到底在干啥
    tyzual
        18
    tyzual  
       2017-04-11 16:22:40 +08:00
    *(unsigned int*)sample = *((unsigned int*)Buffer+i);

    楼主主要是看不懂这句话吧。
    按照楼主的说明 Buffer 应该是一个类似于
    byte *Buffer 或者 byte Buffer[随便一个什么数字] 的东西。
    等号右边先把 Buffer(强行)转成一个 unsigned int *这样的话,后面 + i 就会按照无符号整型来计算偏移量,也就是+i 会向后移动 i * sizeof(unsigned int) 个地址。(否则会向后移动 i * sizeof(byte))。
    计算完成偏移量以后,再对这个地址解引用(取值),因为这个时候,地址的类型是 unsigned int *所以此时编译器会把当前地址储存的数据当成一个无符号整形来对待, unsigned int 站四个 byte ,所以编译器会从计算完成的偏移量开始向后读取四个 byte 的内容作为要赋的值。即等号右边的值。

    等号左边先把 sample 强行转成了一个 unsigned int *然后在解引用(取值)。因此,解引用完成的时候,等号左边的类型是一个 unsigned int (虽然实际上不是)。因此编译器会把等号右边的值写入到 sample 起始地址到 sample 地址后四个 byte 中。
    而 sample 的实际类型是 byte[4],长度正好也是四个 byte 。所以 sample[0] 的值正好就是赋值号右边那个值的最低位 byte 的值, sample[1]是第二低位 byte 的值。以此类推。
    soratadori
        19
    soratadori  
    OP
       2017-04-11 17:10:48 +08:00
    @lany
    @zwzmzd
    @wizardoz
    @tyzual

    谢谢,已经搞定了
    googlebot
        20
    googlebot  
       2017-04-11 17:15:50 +08:00 via iPad
    Lz 没学过 c ? 这是指针基本用法,
    mb4555
        21
    mb4555  
       2017-04-14 02:38:32 +08:00 via Android
    类型转换加解引用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4089 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:14 · PVG 12:14 · LAX 20:14 · JFK 23:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.