c与java通信时数值类型存储的顺序问题

Byte:一个字节,标记为byte 0
Word:二个字节,从byte 0到byte 1
Long : 四个字节,从byte 0到byte 3
每个byte由8个位(bit)组成,从bit 7 到 bit 0 (从左往右)。
每个word由16个 bit 组成,从bit 15 到 bit 0 (从左往右)。
每个long由32个 bit 组成,从bit 31 到 bit 0 (从左往右)。
通常来说左边是高位,右边是低位。

     long length = 4294967294L;

     char hexDigits[] = { '0', '1', '2', '3', '4',
                         '5', '6', '7', '8', '9',
                         'A', 'B', 'C', 'D', 'E', 'F' };

//从输出结果可以看出,long的存储结果是高位放在左边低位放在右边

     char[] longToChars(long length) {//这个函数只取long的右32位,即从左往右数的第32位一直读到最后
            int start =32;
            int position;
            char[] chars = new char[8];
            System.out.println("parameter:"+length);
            for(int i=0;i<8;i++){
                position =(int)((length>>> ( start-(i+1)*4 ) )& 0x000000000000000f);
                chars[i]=hexDigits[position];
            }            System.out.println(new String(chars));//输出的顺序也是从坐往右,依次输出byte对应的16进制字符
            return chars;
    }

longToChars(4294967294L);//输出结果FFFFFFFE
longToChars(65535L);//输出结果0000FFFF
longToChars(31L);//输出结果0000001F

 

最近一个项目中c/c++代码和java代码通信,c那边用的是UINT类型,穿过来时4个字节,在这边java要把这4个字节转换成数值。这里就出现了一个java和c数值类型存储顺序不同的问题了。

从微观上来看,也就是从单个byte来看,在c中和在java中存放的顺序是一样的,例如31在c中表示为0x1F(从左往右输出表示),在java中也是如此。但是如果从宏观,也就是每个byte之间的顺序,java和c就大不一样了。从宏观来说java也是高高低低,高位放左边低位放右边,但是c中刚好相反。

如果在c中,31L的16进制从左往右输出结果是1F00000000000000,java中是000000000000001F。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值