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 PHP7的openssl扩展安装
Linux环境下使用PHPmailer发送邮件时,出现如下错误: SMTP -> ERROR: Failed to connect to server: Unable to find the s ...
- 基于python3.6.6的scrapy环境部署+图像识别插件安装
一.Python3.6.6安装1.安装依赖的二进制软件包yum -y install zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel r ...
- macOS 上安装 PECL
一.简介 PECL(The PHP Extension Community Library)是 PHP 扩展的存储库,为 PHP 所有的扩展提供提供托管和下载服务. 通过 PEAR(PHP Exten ...
- SDUT3145:Integer division 1(换零钱背包)
题目:传送门 题目描述 整数划分是一个非常经典的数学问题. 所谓整数划分,是指把一个正整数n写成为n=m1+m2+...+mi的形式,其中mi为正整数,并且1<=mi<=n,此时,{m1, ...
- 20165324 Java实验五 网络编程与安全
20165324 Java实验五 网络编程与安全 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:何春江 学号:20165324 指导教师:娄嘉鹏 实验日期:2018年5月28日 实 ...
- FileLoadTools
/** * Created by dev013 on 9/9/14. */ var FileLoadTools = (function () { var my = {}; var htmlFile = ...
- sql 自定义函数返回中文,数字,英文
--提取数字IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULLDROP FUNCTION DBO.GET_NUMBER2GOCREATE FUNCTION DBO. ...
- 10、property
成人的BMI数值:过轻:低于18.5正常:18.5-23.9过重:24-27肥胖:28-32非常肥胖, 高于32 体质指数(BMI)=体重(kg)÷身高^2(m) EX:70kg÷(1.75×1.75 ...
- 腾讯 微信春招nlp实习生一面二面(猝)
一面: 1.算法题: 1 28数组中出现次数超过一半的数字 2 手写快排:八大排序算法总结(2) 2.项目介绍: 大多都是项目中涉及到的技术. TFIDF 的原理 word2vec的原理 3.算法原理 ...
- HDU - 5592 ZYB's Premutation (权值线段树)
题意:给出序列前k项中的逆序对数,构造出这个序列. 分析:使用权值线段树来确定序列元素. 逆序对的数量肯定是递增的,从最后一个元素开始逆向统计,则\(a[i] - a[i-1]\)即位置i之前比位置i ...