`
ccjsjymg
  • 浏览: 61981 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何将java中负数转化为无符号类型32位的,与c中执行的结果不一样,请高手指点

阅读更多
下面分别是两段java和c当中的代码,其中java代码是从c中移植过来的,执行结果不一样,导致出现的原因是:在java中不存在无符号类型32位,所以导致结果不一样,请高手指点一二,谢谢!
import java.math.BigDecimal;
import java.math.BigInteger;
                                                                                               
public class SimLock {                                                                         
	private static final String SEED = "4589652157125675";                                       
	private static final int SIMLOOK_SPE_ICCID_LEN = 20;                                         
	private static final int SIMLOOK_SPE_PIC_PSW_LEN = 16;                                       
                                                                                               
	public static int SimLookGenPicPsw(String strSrc, int nSrcLen, char[]strDec, int nDecLen)   
	{               
		int srcMinLength = 0;                                                                      
		int i = 0;                                                                                 
		int j = 0;  
		
		BigDecimal data1 = new BigDecimal(0);
		BigDecimal data2 = new BigDecimal(0);
		BigDecimal decData1 = new BigDecimal(0);
		BigDecimal decData2 = new BigDecimal(0);  
		char[] vTmpSrc = new char[SIMLOOK_SPE_ICCID_LEN];
		char[] vPSW = new char[SIMLOOK_SPE_PIC_PSW_LEN];

		if ( strSrc == null )                                                    
			return -1;                                                                               
		                                                                                           
		if ( 6 > nSrcLen || SIMLOOK_SPE_PIC_PSW_LEN > nDecLen )                                    
			return -1;                                                                               
		                                                                                           
		//源字符串最小长度                                                                                                                                                                    
		srcMinLength = (strSrc.length() > nSrcLen) ? nSrcLen:strSrc.length();
		
		//不足20位前面补0                                                                          
		if ( srcMinLength < SIMLOOK_SPE_ICCID_LEN )                                                
		{                                                                                          
			for(i = 0;i < SIMLOOK_SPE_ICCID_LEN - srcMinLength;++i )                                 
			{                                                                                        
				vTmpSrc[i] = '0';                                                                     
			}                                                                                        
			                                                                                         
			for(j = 0;j < srcMinLength;++j)                                                          
			{                                                                                        
				vTmpSrc[i++] = strSrc.charAt(j);                                                              
			}                                                                                        
		}                                                                                          
		else/*超过20位的后面丢弃*/                                                                 
		{                                                                                          
			for(j = 0;j < SIMLOOK_SPE_ICCID_LEN;++j )                                                
			{                                                                                        
				vTmpSrc[j] = strSrc.charAt(j);                                                               
			}                                                                                        
		}                                                                                                                                                                                                                                    
		i = 4;/*前4 位跳过*/                                                                       
		j = 0;                                                                                     
		while(i < SIMLOOK_SPE_ICCID_LEN)                                                           
		{     
			vPSW[j] = (char)(vTmpSrc[i]^SEED.charAt(j));                                                                                                                                    
			if ( vTmpSrc[i] > '9' || vTmpSrc[i] < '0' )                                              
			{                                                                                        
				/*把非数字字符转换成数字*/                                                             
	            vPSW[j] = (char) (vTmpSrc[i]&0x07);                                              
			} 
			
			 /*转换成数值前,保证最高位非0*/                                                          
	        if (vPSW[0] == '0')                                                                  
	        {        
	            vPSW[0] = '2';                                                                   
	        }                                                                                    
	        if (vPSW[(SIMLOOK_SPE_PIC_PSW_LEN/2)] == '0')                                        
	        {                       
	            vPSW[(SIMLOOK_SPE_PIC_PSW_LEN/2)] = '6';                                         
	        }
	      
	        ++i;++j;                                                                             
		}  
		/*把16位字符串转换成两个数值*/                                                             
		i = 0;                                                                                     
		while(i<(SIMLOOK_SPE_PIC_PSW_LEN/2))                                                       
	    {                                                                                        
	        data2 = data2.multiply(new BigDecimal(10)).add(new BigDecimal(vPSW[i] - '0'));  
	        data1 = data1.multiply(new BigDecimal(10)).add(new BigDecimal(vPSW[i+(SIMLOOK_SPE_PIC_PSW_LEN/2)] - '0'));
	        i++;                                                                                 
	    }                                                                                        
		 /*对数值进行与,异或*/
	    decData1 = new BigDecimal(data1.toBigIntegerExact().and(data2.toBigIntegerExact()));
	    System.out.println(decData1);
	    decData2 = new BigDecimal(data1.toBigInteger().xor(data2.toBigInteger()));
	    i= 0;                                                                                    
	    /*再把数值转换成字符串*/
	    while(i<(SIMLOOK_SPE_PIC_PSW_LEN/2))                                                     
	    {                            
	    	srcMinLength = decData1.toBigInteger().mod(new BigInteger("10")).intValue();	
	    	strDec[i] = (char) (srcMinLength + '0');  
	        decData1 = new BigDecimal(decData1.toBigInteger().divide(new BigInteger("10")));                                                              
	    	srcMinLength = decData2.toBigInteger().mod(new BigInteger("10")).intValue();	                                              
	        strDec[i+(SIMLOOK_SPE_PIC_PSW_LEN/2)] = (char) (srcMinLength + '0');                 
	        decData2 = new BigDecimal(decData2.toBigInteger().divide(new BigInteger("10")));  
	        i++;                                                                                 
	    }
		return 1;                                                                                  
		                                                                                           
	}
	
	
} 



//c代码
#include <string.h>
#include <stdio.h>
#ifndef FALSE   /* in case these macros already exist */
#define FALSE 0  /* values of boolean */
#endif
#ifndef TRUE
#define TRUE 1
#endif

typedef signed char ascii;
typedef unsigned char           u8;
typedef unsigned long int       u32;
#define min(a, b) (a)<(b)?(a):(b)
#define SPE_SIMLOCK_TRACE printf
#define SIMLOOK_SPE_ICCID_LEN 20
#define SIMLOOK_SPE_PIC_PSW_LEN 16
static u8 SIMLOOKGenPICPSW(ascii *sSrc, u8 nSrcLen, ascii *sDec, u8 nDecLen)
{
    u8 i = 0;
    u8 l = 0;
    u8 tmp = 0;
    u8 vPSW[SIMLOOK_SPE_PIC_PSW_LEN+1] = {0};
	u8 vTmpSrc[SIMLOOK_SPE_ICCID_LEN+1] = {0};
    u32 data1 = 0, data2 = 0, decData1 = 0, decData2;
    static u8 seed[] = "4589652157125675";
    if ((!sSrc) || (!sDec)||
        (6/*最小长度为6位*/ > nSrcLen) || ((SIMLOOK_SPE_PIC_PSW_LEN+1) > nDecLen))
    {
        return -1;
    }
	tmp = strlen((const char *)sSrc);
	tmp = min(tmp, nSrcLen);
	/*不足20位前面补0*/
	if (tmp < SIMLOOK_SPE_ICCID_LEN)
	{
		for(i = 0;i<(SIMLOOK_SPE_ICCID_LEN-tmp);i++)
		{
			vTmpSrc[i] = '0';
		}
		strncpy((char*)(vTmpSrc+i), (const char*)sSrc, tmp);
	}
	else
	{
		/*超过20位的后面丢弃*/
		strncpy((char*)vTmpSrc, (const char*)sSrc, SIMLOOK_SPE_ICCID_LEN);
	}
	vTmpSrc[SIMLOOK_SPE_ICCID_LEN] = '\0';
	
    i = 4;/*前4 位跳过*/
    while(i<SIMLOOK_SPE_ICCID_LEN)
    {
        vPSW[l] = vTmpSrc[i]^seed[l];
        if ((vTmpSrc[i] > '9') || (vTmpSrc[i] < '0'))
        {
            /*把非数字字符转换成数字*/
            vPSW[l] = vTmpSrc[i]&0x07;
        }
        /*转换成数值前,保证最高位非0*/
        if (vPSW[0] == '0')
        {
            vPSW[0] = '2';
        }
        if (vPSW[(SIMLOOK_SPE_PIC_PSW_LEN/2)] == '0')
        {
            vPSW[(SIMLOOK_SPE_PIC_PSW_LEN/2)] = '6';
        }
        i++;l++;
    }
    SPE_SIMLOCK_TRACE("vPSW = %s\n", vPSW);
    i = 0;
    /*把16位字符串转换成两个数值*/
    while(i<(SIMLOOK_SPE_PIC_PSW_LEN/2))
    {
        data2 = data2*10+(vPSW[i] - '0');
        data1 = data1*10+(vPSW[i+(SIMLOOK_SPE_PIC_PSW_LEN/2)] - '0');
        i++;
    }
    /*对数值进行与,异或*/
    decData1 = data1&data2;
    decData2 = data1^data2;
    SPE_SIMLOCK_TRACE("data1 = %d, data2 = %d\n", data1, data2);
    SPE_SIMLOCK_TRACE("decData1 = %d, decData2 = %d\n", decData1, decData2);
    i= 0;
    /*再把数值转换成字符串*/
    while(i<(SIMLOOK_SPE_PIC_PSW_LEN/2))
    {
        tmp = (u8)(decData1%10);
        sDec[i] = tmp + '0';
        decData1 = decData1/10;
 
        tmp = (u8)(decData2%10);
        sDec[i+(SIMLOOK_SPE_PIC_PSW_LEN/2)] = tmp + '0';
        decData2 = decData2/10;
 
        i++;
    }
    
    sDec[SIMLOOK_SPE_PIC_PSW_LEN] = '\0';
    SPE_SIMLOCK_TRACE("----sDec = %s\n", sDec);
    return TRUE;
}

以上是两段代码,请大牛们给出意见?
分享到:
评论

相关推荐

    JAVA中汉字字符转化为英文字符

    ### JAVA中汉字字符转化为英文字符 #### 知识点概览 本文将详细介绍如何在Java中实现汉字到英文字符的转换。此技术主要用于提取汉字的首字母或进行其他基于字符编码的操作。通过以下两个核心方法:`toTureAsciiStr`...

    C语言有符号数和无符号数运算

    在C语言中,有符号数和无符号数的运算规则可能会导致一些不直观的结果,这是因为它们在内存中的表示方式和运算规则有所不同。首先,我们来理解有符号数和无符号数的基本概念。 有符号数(signed numbers)可以表示...

    C语言系列(二)有符号数和无符号数详解 - CSDN博客1

    在C语言中,数值类型分为两类:有符号类型(signed)和无符号类型(unsigned)。这两种类型在计算机内部存储和处理的方式有所不同,主要体现在对正负值的支持上。 1. **有符号数**: - 有符号类型允许表示正数、零...

    c语言中获取整数和浮点数的符号位

    在C语言中,获取整数和浮点数的符号位是一个非常重要的知识点。符号位是指数值的正负符号,判断符号位是进行逻辑处理的基础。下面是获取整数和浮点数符号位的相关知识点。 首先,为什么要获取符号位?在许多情况下...

    易语言字节集解决无符号整数高位位与源码

    在这个特定的场景中,标题提到的“易语言字节集解决无符号整数高位位与源码”是指利用字节集来处理无符号整数的高位位操作。这通常涉及到数据的位运算,如位移、位与、位或、位异或等。在易语言中,这些操作可以用于...

    java位运算,符号运算 详细解释

    Java位运算是一种底层操作,它直接作用于二进制位,是计算机科学中的基础操作。在Java编程中,位运算可以用于高效地处理数据,尤其是在处理数组、位集或者进行低级优化时非常有用。本篇文章将深入探讨Java中的位运算...

    C语言编一个程序完成64位数据(无符号)的加法,减法运算

    根据给定的信息,本文将详细解释如何在C语言中编写一个程序来实现64位无符号整数的加法和减法运算。 ### 一、背景介绍 在计算机科学领域,处理大整数是一个常见的需求,尤其是在那些需要精确计算且数字可能非常大...

    易语言有符号转换到无符号

    3. 零处理:零在有符号和无符号类型中都是零,无需转换。 4. 位操作:可以使用位移和逻辑运算来实现符号位的清除,从而达到转换的目的。 在易语言有符号转换到无符号源码中,可能包含以下步骤: 1. 检查输入数据...

    单片机中无符号数运算容易出现的问题

    我们所用的单片机很有可能是16位或者8位的,这样,...16位单片机无符号数最大值为65535,有符号数最大值为32767.对于32的单片机来说,因为我们一般所处理的值很少能超过有符号数的最大取值,所以比较少遇到下面出现的问题.

    Verilog实现一个32位有符号除法器和一个32位无符号除法器

    在本文中,我们将深入探讨如何使用Verilog语言来实现32位有符号和无符号除法器。Verilog是一种硬件描述语言(HDL),广泛应用于数字电路设计,包括微处理器、FPGA和ASIC等。本项目包含两个核心部分:32位有符号除法...

    S7-200SMART PLC中无符号数据转换+比较+运算(子程序可重复调用).zip

    在S7-200SMART PLC中,无符号数据类型包括BOOL(布尔型)、BYTE、WORD和DWORD,分别对应位、字节、字和双字。 1. **无符号数据转换**:在S7-200SMART PLC中,数据类型的转换是通过赋值指令实现的。例如,如果需要将...

    verilog实现32位无符号乘法器和带符号乘法器

    这个模块将接收两个32位无符号输入,并返回一个64位的乘积,因为无符号整数乘法的结果可能超出32位的范围。 接下来,带符号乘法器("带符号乘法器")允许处理正负整数,其内部实现会考虑到二进制补码表示的负数。在...

    MATLAB 无符号数和有符号数之间的转化.docx

    例如,unsigned2signed 函数可以将无符号数转化为有符号数,而 signed2unsigned 函数可以将有符号数转化为无符号数。 unsigned2signed 函数的实现可以使用以下 MATLAB 代码: ```matlab function [b] = unsigned2...

    1.将数组分成正数和负数2.16位无符号排序3.七段码4.产生随机数5.字程序编制

    这里我们将深入探讨五个关键知识点,分别是:数组的正负数划分、16位无符号数排序、七段码表示、随机数生成以及字程序编制。 首先,我们来看数组的正负数划分。在编程中,数组是一种存储同类型数据集合的数据结构。...

    【推荐】C语言中有符号数与无符号数解析[归纳].pdf

    在C语言中,有符号数和无符号数是两种不同的数据类型,它们在计算机内部的表示和处理上有显著的区别。有符号数可以表示正数、零和负数,而无符号数只能表示非负整数。 1. **有符号数的表示**: 在有符号数中,通常...

    将有符号数转换为无符号16进制

    在这个场景中,我们可以使用`static_cast`将有符号整数转换为无符号类型。 2. **强制类型转换**:除了使用类型转换函数外,还可以使用旧式的C风格强制类型转换,如`(unsigned int)`。不过,这种方法可能隐藏潜在的...

    有符号数与无符号数的探讨

    这意味着,无论是正数还是负数,亦或是超过一个字节所能表示的最大无符号数,汇编器都将它们视为有符号数,并转换为补码。 例如,`db -20` 和 `db 236` 在汇编后的结果均为 `EC`。这引发了一个问题:一个字节所能...

    java写的将阿拉伯数字转化为中文金额的大写方式

    在Java编程中,将阿拉伯数字转化为中文金额大写是一项常见的任务,特别是在财务系统或报表生成中。这个题目要求实现一个程序,能够读取输入的阿拉伯数字字符串,然后将其转换为符合中国会计规范的中文大写金额表示。...

    Java中的位运算

    2. **移位超过数据类型的最大位数**:无论是正数还是负数,它们的右移、左移、无符号右移32位都是其本身,例如 `-5 &lt;&lt; 32 = -5`、`-5 &gt;&gt; 32 = -5`、`-5 &gt;&gt;&gt; 32 = -5`。 3. **有趣的现象**:将1左移31位再右移31位,...

    c语言无符号数到其他进制数转换源代码

    在C语言中,无符号整数(unsigned int)是不包含负值的整数类型,它只能表示非负整数。与之相反,带符号整数(signed int)可以表示正数、零和负数。无符号整数在内存中占用固定的比特位,其数值范围由机器的字长...

Global site tag (gtag.js) - Google Analytics