- 浏览: 61962 次
- 性别:
- 来自: 北京
最新评论
下面分别是两段java和c当中的代码,其中java代码是从c中移植过来的,执行结果不一样,导致出现的原因是:在java中不存在无符号类型32位,所以导致结果不一样,请高手指点一二,谢谢!
//c代码
以上是两段代码,请大牛们给出意见?
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; }
以上是两段代码,请大牛们给出意见?
发表评论
-
每日一篇
2013-12-24 10:27 586// 001.cpp : 定义控制台应用程序的入口 ... -
拆解数字
2011-03-16 11:46 3924将任一个数字进行拆解,例如: 3 = 2+1 = 1 ... -
数据结构线性表顺序存储操作
2010-06-06 12:43 1667头文件: //********************** ... -
修改内存地址内容,可以修改游戏金币值
2010-04-04 15:16 5136实现修改内存内容核心代码: //进程列表信息 void ... -
输入一个数n,求出n的3次冥等于n个奇数
2010-02-25 01:59 1240#include <stdio.h> #in ... -
十进制转二进制
2009-11-02 23:44 1527好久没用java写了,真有点别扭。。。。。。。。。 pac ... -
c++实现的括号匹配,通过链栈方式
2009-06-24 22:54 2320/* 表达式中的括号是否匹配 */ bool C ... -
7道c练习题
2009-04-28 21:15 1233花了我将近两个小时的时间。。。。。。。。。 /* aut ... -
c++ 随机数rand()必须结合srand(time(NULL))
2009-04-16 00:11 8806引用 在c++中,使用c++ rand()获取随机数必须结合s ...
相关推荐
### JAVA中汉字字符转化为英文字符 #### 知识点概览 本文将详细介绍如何在Java中实现汉字到英文字符的转换。此技术主要用于提取汉字的首字母或进行其他基于字符编码的操作。通过以下两个核心方法:`toTureAsciiStr`...
在C语言中,有符号数和无符号数的运算规则可能会导致一些不直观的结果,这是因为它们在内存中的表示方式和运算规则有所不同。首先,我们来理解有符号数和无符号数的基本概念。 有符号数(signed numbers)可以表示...
在C语言中,数值类型分为两类:有符号类型(signed)和无符号类型(unsigned)。这两种类型在计算机内部存储和处理的方式有所不同,主要体现在对正负值的支持上。 1. **有符号数**: - 有符号类型允许表示正数、零...
在C语言中,获取整数和浮点数的符号位是一个非常重要的知识点。符号位是指数值的正负符号,判断符号位是进行逻辑处理的基础。下面是获取整数和浮点数符号位的相关知识点。 首先,为什么要获取符号位?在许多情况下...
在这个特定的场景中,标题提到的“易语言字节集解决无符号整数高位位与源码”是指利用字节集来处理无符号整数的高位位操作。这通常涉及到数据的位运算,如位移、位与、位或、位异或等。在易语言中,这些操作可以用于...
Java位运算是一种底层操作,它直接作用于二进制位,是计算机科学中的基础操作。在Java编程中,位运算可以用于高效地处理数据,尤其是在处理数组、位集或者进行低级优化时非常有用。本篇文章将深入探讨Java中的位运算...
根据给定的信息,本文将详细解释如何在C语言中编写一个程序来实现64位无符号整数的加法和减法运算。 ### 一、背景介绍 在计算机科学领域,处理大整数是一个常见的需求,尤其是在那些需要精确计算且数字可能非常大...
3. 零处理:零在有符号和无符号类型中都是零,无需转换。 4. 位操作:可以使用位移和逻辑运算来实现符号位的清除,从而达到转换的目的。 在易语言有符号转换到无符号源码中,可能包含以下步骤: 1. 检查输入数据...
我们所用的单片机很有可能是16位或者8位的,这样,...16位单片机无符号数最大值为65535,有符号数最大值为32767.对于32的单片机来说,因为我们一般所处理的值很少能超过有符号数的最大取值,所以比较少遇到下面出现的问题.
在本文中,我们将深入探讨如何使用Verilog语言来实现32位有符号和无符号除法器。Verilog是一种硬件描述语言(HDL),广泛应用于数字电路设计,包括微处理器、FPGA和ASIC等。本项目包含两个核心部分:32位有符号除法...
在S7-200SMART PLC中,无符号数据类型包括BOOL(布尔型)、BYTE、WORD和DWORD,分别对应位、字节、字和双字。 1. **无符号数据转换**:在S7-200SMART PLC中,数据类型的转换是通过赋值指令实现的。例如,如果需要将...
这个模块将接收两个32位无符号输入,并返回一个64位的乘积,因为无符号整数乘法的结果可能超出32位的范围。 接下来,带符号乘法器("带符号乘法器")允许处理正负整数,其内部实现会考虑到二进制补码表示的负数。在...
例如,unsigned2signed 函数可以将无符号数转化为有符号数,而 signed2unsigned 函数可以将有符号数转化为无符号数。 unsigned2signed 函数的实现可以使用以下 MATLAB 代码: ```matlab function [b] = unsigned2...
这里我们将深入探讨五个关键知识点,分别是:数组的正负数划分、16位无符号数排序、七段码表示、随机数生成以及字程序编制。 首先,我们来看数组的正负数划分。在编程中,数组是一种存储同类型数据集合的数据结构。...
在C语言中,有符号数和无符号数是两种不同的数据类型,它们在计算机内部的表示和处理上有显著的区别。有符号数可以表示正数、零和负数,而无符号数只能表示非负整数。 1. **有符号数的表示**: 在有符号数中,通常...
在这个场景中,我们可以使用`static_cast`将有符号整数转换为无符号类型。 2. **强制类型转换**:除了使用类型转换函数外,还可以使用旧式的C风格强制类型转换,如`(unsigned int)`。不过,这种方法可能隐藏潜在的...
这意味着,无论是正数还是负数,亦或是超过一个字节所能表示的最大无符号数,汇编器都将它们视为有符号数,并转换为补码。 例如,`db -20` 和 `db 236` 在汇编后的结果均为 `EC`。这引发了一个问题:一个字节所能...
在Java编程中,将阿拉伯数字转化为中文金额大写是一项常见的任务,特别是在财务系统或报表生成中。这个题目要求实现一个程序,能够读取输入的阿拉伯数字字符串,然后将其转换为符合中国会计规范的中文大写金额表示。...
2. **移位超过数据类型的最大位数**:无论是正数还是负数,它们的右移、左移、无符号右移32位都是其本身,例如 `-5 << 32 = -5`、`-5 >> 32 = -5`、`-5 >>> 32 = -5`。 3. **有趣的现象**:将1左移31位再右移31位,...
在C语言中,无符号整数(unsigned int)是不包含负值的整数类型,它只能表示非负整数。与之相反,带符号整数(signed int)可以表示正数、零和负数。无符号整数在内存中占用固定的比特位,其数值范围由机器的字长...