最近接到一个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的问题。

未完待续。

github源码地址

参考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之间的问题的更多相关文章

  1. java中的大数BigInteger

    compareTo比较大小 equals比较是否相等 ,不能用== while(cin.hasNext())//等价于!=EOF n=cin.nextBigInteger();//读入一个大整数 Sy ...

  2. 杭电HDOJ--ACM1002(JAVA解题,运用BigInteger)(自定义MBigInteger 简单实现大数处理----完善后可以实现百亿计算器)

    转载声明:原文转自http://www.cnblogs.com/xiezie/p/5501901.html     JAVA解题:   import java.util.*; import java. ...

  3. Java基础知识强化87:BigInteger类之BigInteger加减乘除法的使用

    1. BigInteger加减乘除法的使用 public BigInteger add(BigInteger val):加 public BigInteger subtract(BigInteger ...

  4. Java基础知识强化86:BigInteger类之BigInteger概述和构造方法

    1. BigInteger类概述   可以让超过Integer范围内的数据进行运算 2. 构造方法: public BigInteger(String val) 3. 代码示例: package cn ...

  5. java 大数据运算 BigInteger BigDecimal

    package cn.sasa.demo5; import java.math.BigDecimal; import java.math.BigInteger; public class BigDat ...

  6. (转)Java大数操作(BigInteger、BigDecimal)

    基础知识 对于二进制来说,最高位代表正负号,-0表示-128,+0表示032位系统int型4个字节:-(2的31次方) ~ (2的31次方) 减 1最大负数:10000000 00000000 000 ...

  7. 关于Java大数操作(BigInteger、BigDecimal)

    本文目标 可以使用BigInteger操作大整数 可以使用BigDecimal指定小数的保留位数 基础知识 对于二进制来说,最高位代表正负号,-0表示-128,+0表示032位系统int型4个字节:- ...

  8. java中大整型BigInteger及setBit和testBit方法

    最近在修改公司之前的项目,在项目中遇到了权限校验的问题,代码中出现了BigInteger的setBit()testBit()方法,之前未接触过,所以了解了下BigInteger. 在Java中,由CP ...

  9. java 常用类库:BigInteger大整数;BigDecimal大小数(解决double精度损失);

    大整数BigInteger package com.zmd.common_class_libraries; import java.math.BigInteger; /** * @ClassName ...

随机推荐

  1. UVA10763:Foreign Exchange&&UVA10340: All in All(水题)

    10763:水题不解释直接贴代码. #include <iostream> #include <string.h> #include <stdio.h> #incl ...

  2. matplotlib中的颜色及线条控制

    出自 http://www.cnblogs.com/darkknightzh/p/6117528.html 参考网址: http://stackoverflow.com/questions/22408 ...

  3. 以二进制方式读取图片保存到string

    procedure TForm1.BitBtn1Click(Sender: TObject);var  StringStream : TStringStream;  FSize : integer;  ...

  4. eclipse 创建jsp报错

  5. IDEA 编译报错: 未结束的字符串文字

    最近在搞新项目,同事用的eclipse开发,而我用的是ide,项目初始是由同事创建的,项目编码是UTF-8,而我开发的ide工具默认是GBK编码,导致在编译的时候报错: 未结束的字符串文字 这个问题就 ...

  6. iOS知识点整理

    1.宏定义 #define  #   ## a. 后面一个#是转成字符串 b. 后面## 是连接的作用 2. __attribute__ 常用的 __attribute__(( constructor ...

  7. linux中uptime命令获取主机运行时间和查询系统负载信息

    系统中的uptime命令主要用于获取主机运行时间和查询linux系统负载等信息.uptime命令可以显示系统已经运行了多长时间,信息显示依次为:现在时间.系统已经运行了多长时间.目前有多少登陆用户.系 ...

  8. 清除list或者map集合,减少内存的占用率

    1.在编写程序对数据处理的时候我们经常会使用到list和map集合,有些时候我们存到集合里的数据只是暂时性的,在验证完或者使用完之后尽量对list或者map清空,及list.clear()后者map. ...

  9. Python面试题目之(针对dict或者set数据类型)边遍历 边修改 报错dictionary changed size during iteration

    # result 是一个字典, 把里面属性值是None的属性删除 for key in result: if not result[key]: del result[key] continue 但是报 ...

  10. windows上面非常好用的辅助软件

    1.everything  快速查找本地文件 下载地址:http://www.voidtools.com/