c# BigInteger.Parse和java new BigInteger的一些小问题

背景:最近在做一个c#转java的项目

在讲我的需求之前,先来介绍一下标题中的两个方法

c#:  
BigInteger.Parse 方法	
定义:将数字的字符串表示形式转换为它的等效 BigInteger 表示形式。
命名空间:
System.Numerics
程序集:
System.Runtime.Numerics.dll

我用到的一个重载的方法:Parse(String, NumberStyles)
定义:将指定样式的数字的字符串表示形式转换为它的等效 BigInteger。
java:
 new BigInteger(str,radix)
 定义:将radix进制的str字符串转换为BigInter型

共同点:

  1. 都是十六进制转10进制

不同点:

  1. c#的那个方法需要注意如果十六进制字符串的前两位的数等于或者大于0x80,那么Parse()方法会把第一位作为符号位,即把它存储为负数。如果需要把此十六进制的字符串解析为正数,需要在字符串前加上“0”
  2. java的那个方法就是暴力的十六进制转正数

例如:

//C#
string str = BigInteger.Parse("FFFFFFFFFFFEA070", NumberStyles.HexNumber).toString
Console.WriteLine(str);//结果为-90000


//java
String b = ""+new BigInteger("FFFFFFFFFFFEA070",16);
System.out.println(b);/结果为18446744073709461616`

然后我的需求是把java的结果改成跟c#的一样。
我想了很久,最后在java的那里添加了如下代码

String b = ""+new BigInteger("FFFFFFFFFFFEA070",16).longValue();
System.out.println(b);/结果为-90000`

问题解决!!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是将代码改写成C#窗体的示例: ```csharp using System; using System.Numerics; using System.Windows.Forms; namespace RSAExample { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnEncrypt_Click(object sender, EventArgs e) { // 生成公钥和私钥 BigInteger p = BigInteger.Parse("857504083339712752489993810777"); BigInteger q = BigInteger.Parse("1029224947942998075080348647219"); BigInteger n = p * q; BigInteger phi = (p - 1) * (q - 1); BigInteger e = 65537; BigInteger d = ModInverse(e, phi); // 加密数据 BigInteger message = BigInteger.Parse(txtData.Text); BigInteger encrypted = ModPow(message, e, n); // 解密数据 BigInteger decrypted = ModPow(encrypted, d, n); // 显示结果 txtEncrypted.Text = encrypted.ToString(); txtDecrypted.Text = decrypted.ToString(); } // 求模反元素 public static BigInteger ModInverse(BigInteger a, BigInteger m) { BigInteger m0 = m; BigInteger y = 0, x = 1; if (m == 1) return 0; while (a > 1) { BigInteger q = a / m; BigInteger t = m; m = a % m; a = t; t = y; y = x - q * y; x = t; } if (x < 0) x += m0; return x; } // 模幂运算 public static BigInteger ModPow(BigInteger b, BigInteger e, BigInteger m) { BigInteger result = 1; while (e > 0) { if ((e & 1) == 1) result = (result * b) % m; e >>= 1; b = (b * b) % m; } return result; } } } ``` 在这个示例,我们在窗体添加了三个文本框(txtData、txtEncrypted和txtDecrypted)和一个按钮(btnEncrypt)。当用户输入要加密的数据后,点击按钮即可进行加密和解密,并将结果显示在相应的文本框

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头盔程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值