java和C的数据转换问题

bjskyhorse 2011-03-16 10:29:59
因为要把以前用C语言实现的算法改为java实现,遇到一个问题,以前C语言程序里面有:
unsigned char sm3_internal[32];
#define U32 unsigned long


#define AA (*(U32*)(sm3_internal))
#define BB (*(U32*)(sm3_internal+4))
#define CC (*(U32*)(sm3_internal+8))
#define DD (*(U32*)(sm3_internal+12))
#define EE (*(U32*)(sm3_internal+16))

#define FF (*(U32*)(sm3_internal+20))
#define GG (*(U32*)(sm3_internal+24))
#define HH (*(U32*)(sm3_internal+28))

AA = 0x7380166f;
BB = 0x4914b2b9;
CC = 0x172442d7;
DD = 0xda8a0600;
EE = 0xa96f30bc;
FF = 0x163138aa;
GG = 0xe38dee4d;
HH = 0xb0fb0e4e;


这段代码意思是,AA,BB,CC.....HH是unsigned long类型,而且都是4字节,sm3_internal这个数组的32个字节就是与这8个数字对应的4个字节,总共是32个。
这段代码我改怎么改,特别是AA,BB....HH,java里面根本就没有合适的数据类型,long是8个字节,不满足要求,int是4个字节,可是远远小于unsigned long所能表示的范围,会越界。
...全文
211 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
树成 2011-04-12
  • 打赏
  • 举报
回复
问题还没解决么?
Java里面的long类型是C里面的int_64类型,因此是c弄字宽的两倍,当然这个跟编译器有关,我目前已VC6为准。
你在c里面使用unsigned long的位移,在java里面应该没有什么问题的。
而且java里面为了处理符号位移的问题,有一个无符号位移的运算符 >>> 也许你在C里面显示的是正数,但是在java里面可能就变成一个负数了,不过这不用担心,数据本身并没有被改变,只是显示改变了,使用>>>可以得到正确的值,不过用加减运算符可能就有问题了。对于这个难题,你也许需要使用BitInt类来处理,并且使用byte数组的形式来处理java与C数据转换的问题。
bjskyhorse 2011-03-27
  • 打赏
  • 举报
回复
unsigned long RLC_test(unsigned long x,unsigned long n)
{
unsigned long ret;
unsigned long uVal1,uVal2;
uVal1=((x) << (n));
uVal2=((x) >> (32 - (n)));
ret= uVal1 | uVal2;
return ret;
}
那如果是java的public static long lRLC(long x, long n),怎样才能得到相同的结果呢?java里面的long可是8个字节
那我该怎么做呢?如果使用long,怎样才能实习类似C里面unsigned long 4字节移位的效果?
冰思雨 2011-03-25
  • 打赏
  • 举报
回复
至于内存空间的占用问题,以及效率高低的问题。
一般情况下,对于内存和效率两个问题,
对整体软件功能,没有产生瓶颈的时候(或者说,问题很尖锐的时候),
是不做过多考虑的。
冰思雨 2011-03-25
  • 打赏
  • 举报
回复
Java的基本类型里面,表示数字的,都是有符号的,不存在C语言中的unsigned 类型。
所以,4个字节,在Java中无法实现无符号的整形类型表示。
所以,只有两种选择,要么,选择有符号的整形数据表示;
要么,选择有符号的长整型数据,进行表示。
具体选用什么方式进行表示,要看数据所代表的意义。

如果数据代表的是无符号的数字大小,
那么,转换为Java,就需要long(长整形)数据进行表示,
以免丢失数据(或者楼主所说的,数据越界)。
如果数据不代表数字大小和正负号,
那么,可以考虑,使用Java的整形数据进行表示,
至于高位字节(带有正负负号的那个字节)怎样处理,
也是有技巧可循的。
qq10372849 2011-03-25
  • 打赏
  • 举报
回复
这个我也不会
bjskyhorse 2011-03-25
  • 打赏
  • 举报
回复
比如这样一个函数:C语言的。
如果x,n分别给0x8cc293e1,12,得到的结果是0x293e18cc
unsigned long RLC_test(unsigned long x,unsigned long n)
{
unsigned long ret;
unsigned long uVal1,uVal2;
uVal1=((x) << (n));
uVal2=((x) >> (32 - (n)));
ret= uVal1 | uVal2;
return ret;
}
那如果是java的public static long lRLC(long x, long n),怎样才能得到相同的结果呢?java里面的long可是8个字节
bjskyhorse 2011-03-16
  • 打赏
  • 举报
回复
因为java的int表示不了C里面 unsigned long的范围,而 java的long又是8字节而不是4字节;
树成 2011-03-16
  • 打赏
  • 举报
回复
C里面的long类型应该是4字节的,C里面只有int_64是8字节,所以java的long有能力获取到这个值。不过int就很难说了。
如果不行,你可能要转换成一个byte数组,然后再java里面用BigInt类转换。
bjskyhorse 2011-03-16
  • 打赏
  • 举报
回复
我现在是需要把C转为java的,比如C里面的一个unsigned long变量是0x912e2566,如果用java里面的int,肯定就越界了,如果用long表示,又成了8个字节,有没有办法,用4个字节表示?
树成 2011-03-16
  • 打赏
  • 举报
回复
多4个字节并没什么关系,肯依存放数据即可,8字节的long可以存放4字节的int。
如果要把8字节long转换成C的unsigned long,在c里面做个强转即可。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧