Java BigInteger 与C# BigInteger之间的问题
最近接到一个Java代码转C#代码的项目。本来就两个函数看起来很简单的,后来折腾了一天,终于完美收官。
碰到的第一个问题是:java的BigInteger构造函数里面BigInteger(string,int),是字符串和进制数,.net的确是具体的整型,数字型的。
后来发现有个函数BigInteger.Parse里面可以使用字符串类型的,就拿来直接使用。后来发现某一部分数据对,一部分数据不对。
BigInteger.Parse(hexStr, NumberStyles.HexNumber)
这下傻逼了,网上找资料查询,找到一篇地址:https://majing.io/posts/10000005661225
原文说明如下:
在C#十六进制转换为十进制: BigInteger number = BigInteger.Parse(hexString, NumberStyles.AllowHexSpecifier);
或者 BigInteger number = BigInteger.Parse(hexString, NumberStyles.HexNumber);
HexNumber是一个组合的NumberStyles,它是由AllowHexSpecifier,AllowLeadingWhite和AllowTrailingWhite组合而成,它允许字符串前后后空格。 使用BigInteger.Parse()转换十六进制的字符串为十进制的数字有两个注意点: 十六进制的字符串不能以“0x”或者“&h”为前缀
如果十六进制字符串的前两位的数等于或者大于0x80,那么Parse()方法会把第一位作为符号位,即把它存储为负数。如果需要把此十六进制的字符串解析为正数,需要在字符串前加上“”。
示例 using System;
using System.Globalization;
using System.Numerics; public class Example
{
public static void Main()
{
string[] hexStrings = { "", "E293", "F9A2FF", "FFFFFFFF",
"", "0E293", "0F9A2FF", "0FFFFFFFF",
"", "00E293", "00F9A2FF", "00FFFFFFFF" };
foreach (string hexString in hexStrings)
{
BigInteger number = BigInteger.Parse(hexString, NumberStyles.AllowHexSpecifier);
Console.WriteLine("0x{0}:{1}.", hexString, number);
}
}
}
输出结果: 0x80:-
0xE293:-
0xF9A2FF:-
0xFFFFFFFF:-
0x080:
0x0E293:
0x0F9A2FF:
0x0FFFFFFFF:
0x0080:
0x00E293:
0x00F9A2FF:
0x00FFFFFFFF:
第二个问题是java的byte是有符号类型(java就没有无符号类型的数据),值域:-128~127
而c#的byte是无符号类型数值,值域:0~255,在做BigInteger.ToByteArray()导致得到的数据不一致。
使用&与运算 int num1=byte[0]&0xff 与运算一下。原理:0xff是十六进制整形(至少16位)在直接转化为整形时是255,相当于0x00ff,其二进制表达为前面8个0,后面8个1.而我们知道任何数值与1与还等于其本身。但是0xff是整形至少16个位,byte只拥有8个位,与0x00ff的与运算就相当于吧byte扩充成至少16位的整形。转换自然就OK了。但是不能用0xffff。这是为什么呢?如果是正数,没有什么问题,其实与0xff与运算分为两步,第一个把byte真实扩充为至少16位的整形,扩充的方式正数前用0填位,负数用1填位。所依负数就有问题了,因为java对于8位的负数(计算机系统负数表达形式用正数的补码标示负数,即正数取反1变0,0变1,然后最后一位加1,这时候负数的第一位肯定是1)扩展位数时时前面是用1填充的,其实就变成0xff[byte]。0xff只是后面8位是1,其实就等于0x00ff,前面是0.与运算之后把负数系统自动扩展的1去掉了,就是一个变成正数了,但是用0xffff,如果是16位的整形,与负数与运算,就会保持不变。如果是32为的整形,就会变成一个更大的值0x0000ff[byte]。
引用地址:https://www.cnblogs.com/edzjx/archive/2012/09/16/2687419.html
但是目前碰到的情况是不能变更java这边的代码。所以必须得想办法解决c#的问题。后来想到c#有个sbye是有符号的,采用sbye[]替换bye[],转换问题得以解决。
第三个问题,是base64的问题。
未完待续。
参考1:https://www.codeproject.com/Articles/276993/Base-Encoding-on-a-GPU
参考2:http://www.java2s.com/Code/CSharp/Development-Class/TheBase64utilityclassperformsbase64encodinganddecoding.htm
Java BigInteger 与C# BigInteger之间的问题的更多相关文章
- java中的大数BigInteger
compareTo比较大小 equals比较是否相等 ,不能用== while(cin.hasNext())//等价于!=EOF n=cin.nextBigInteger();//读入一个大整数 Sy ...
- 杭电HDOJ--ACM1002(JAVA解题,运用BigInteger)(自定义MBigInteger 简单实现大数处理----完善后可以实现百亿计算器)
转载声明:原文转自http://www.cnblogs.com/xiezie/p/5501901.html JAVA解题: import java.util.*; import java. ...
- Java基础知识强化87:BigInteger类之BigInteger加减乘除法的使用
1. BigInteger加减乘除法的使用 public BigInteger add(BigInteger val):加 public BigInteger subtract(BigInteger ...
- Java基础知识强化86:BigInteger类之BigInteger概述和构造方法
1. BigInteger类概述 可以让超过Integer范围内的数据进行运算 2. 构造方法: public BigInteger(String val) 3. 代码示例: package cn ...
- java 大数据运算 BigInteger BigDecimal
package cn.sasa.demo5; import java.math.BigDecimal; import java.math.BigInteger; public class BigDat ...
- (转)Java大数操作(BigInteger、BigDecimal)
基础知识 对于二进制来说,最高位代表正负号,-0表示-128,+0表示032位系统int型4个字节:-(2的31次方) ~ (2的31次方) 减 1最大负数:10000000 00000000 000 ...
- 关于Java大数操作(BigInteger、BigDecimal)
本文目标 可以使用BigInteger操作大整数 可以使用BigDecimal指定小数的保留位数 基础知识 对于二进制来说,最高位代表正负号,-0表示-128,+0表示032位系统int型4个字节:- ...
- java中大整型BigInteger及setBit和testBit方法
最近在修改公司之前的项目,在项目中遇到了权限校验的问题,代码中出现了BigInteger的setBit()testBit()方法,之前未接触过,所以了解了下BigInteger. 在Java中,由CP ...
- java 常用类库:BigInteger大整数;BigDecimal大小数(解决double精度损失);
大整数BigInteger package com.zmd.common_class_libraries; import java.math.BigInteger; /** * @ClassName ...
随机推荐
- Linux使用scp命令实现文件的上传和下载
上传本地/data/project/test.zip 文件至远程服务器192.168.1.2的 /root 目录下,代码如下: scp /home/project/test.zip root@192 ...
- java中使用MD5对密码进行加密
import org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder; import org ...
- Java 面试总结 面试常问的关键字总结
文章出处http://www.cnblogs.com/IUbanana/p/7116520.html 关键字: final finalize finally throws和throw static关键 ...
- 常用的底层语法(objc_get,class_get,_cmd,objc_msgSend)
一,关联 objc_get 1)建立关联:objc_setAssociatedObject:该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略:当源对象销毁,关联的对象也会被销毁 源对象: ...
- Django:学习笔记(9)——用户身份认证
Django:学习笔记(9)——用户身份认证 User
- json转List、Map
import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Li ...
- jquery Treeview插件的使用及复选框的级联
本文是对jquery的Treeview插件使用的实例介绍 效果图如下: 文件结构如下:
- JavaScript 引用【转】
从一个例子说起: var m ={a:’a’, b:’b’}; var n=m; n.c=’c’; 那么在这个时候 , m.c 也会变成 ’c’! 这个问题在我最开始学习 JS 语言时个人一直处于概念 ...
- 《Java程序设计》实验1实验报告
20145318 <Java程序设计>实验1实验报告 实验题目 通过对500个数据进行操作,实现快速排序.选择排序.直接插入排序算法时间复杂度的比较:并在排序数据中快速查找某一数据,给出查 ...
- #ifndef用法
用于避免重复包含头文件 #ifndef _STDIO_H_ #define _STDIO_H_ ...... #endif