【问题标题】:C# Bitwise XOR two very large hex numbersC#按位异或两个非常大的十六进制数
【发布时间】:2015-11-15 23:34:34
【问题描述】:

我有两个十六进制数字,为了试验 OTP,我尝试使用 C# 进行异或运算。不幸的是,这两个数字都在数百位数的数量级上——显然太大而无法存储在intlong 中。我如何存储/异或它们?现在,我存储为BigIntegers,如下所示:

public static string XOR(string string_1, string string_2){
            BigInteger b1 = BigInteger.Parse(string_1, System.Globalization.NumberStyles.AllowHexSpecifier);
            BigInteger b2 = BigInteger.Parse(string_2, System.Globalization.NumberStyles.AllowHexSpecifier);
            BigInteger retVal = b1 ^ b2;
            return retVal.ToString("X");
        }

没有产生预期的结果。谢谢!

编辑:

输入:

string_1 = 32510bfbacfbb9befd54415da243e1695ecabd58c519cd4bd90f1fa6ea5ba47b01c909ba7696cf606ef40c04afe1ac0aa8148dd066592ded9f8774b529c7ea125d298e8883f5e9305f4b44f915cb2bd05af51373fd9b4af511039fa2d96f83414aaaf261bda2e97b170fb5cce2a53e675c154c0d9681596934777e2275b381ce2e40582afe67650b13e72287ff2270abcf73bb028932836fbdecfecee0a3b894473c1bbeb6b4913a536ce4f9b13f1efff71ea313c8661dd9a4ce
string_2 = 71946f9bbb2aeadec111841a81abc300ecaa01bd8069d5cc91005e9fe4aad6e04d513e96d99de2569bc5e50eeeca709b50a8a987f4264edb6896fb537d0a716132ddc938fb0f836480e06ed0fcd6e9759f40462f9cf57f4564186a2c1778f1543efa270bda5e933421cbe88a4a52222190f471e9bd15f652b653b7071aec59a2705081ffe72651d08f822c9ed6d76e48b63ab15d0208573a7eef027

预期结果(根据 Python 和this online XOR calculator):

32510bfbacfbb9befd54415da243e1695ecabd58c519cd4bd90f1fa6ea5b83624730b208d83b237176b5a41e13d1a2c0080f55d6fb05e4fd9a6e8aff84a9eec74ec0e3115dd0808c011baa15b2c29edad06d6c319976fc7c7eb6a8727e79906c96397dd14594a17511e2ba018c3267935877b5c2c1750f28b2d5bf55faa6c2218c30e58f17542717ad6f8622dd0069a4886d20d3d657a80a869c8f6025399f914f23e5ccd3a999c271a50994c7db959c5c0b73334d15ba3754e9

【问题讨论】:

  • byte[] 有什么问题。顺便说一句:which isn't producing the expected result 你的意见是什么?预期的输出是什么?
  • 如果 ((b1 ^ b2) ^ b2) == b1 那么它工作正常
  • 请添加实际结果
  • @maxpovver:严格来说,这是不正确的。如果^ 被实现为什么都不做,那么您的小表达式仍将评估为true。如果^ 翻转b1 的位,b2 的位为 0 而不是 1,则同样适用。^ 的许多可能的错误行为是您的表达式无法发现的。
  • 我投票决定将此问题作为“简单的错字”或“无法复制”来结束,因为正如 Eser 所说,它按预期工作......

标签: c# xor


【解决方案1】:

似乎有人不想相信。

var string_1 = "32510bfbacfbb9befd54415da243e1695ecabd58c519cd4bd90f1fa6ea5ba47b01c909ba7696cf606ef40c04afe1ac0aa8148dd066592ded9f8774b529c7ea125d298e8883f5e9305f4b44f915cb2bd05af51373fd9b4af511039fa2d96f83414aaaf261bda2e97b170fb5cce2a53e675c154c0d9681596934777e2275b381ce2e40582afe67650b13e72287ff2270abcf73bb028932836fbdecfecee0a3b894473c1bbeb6b4913a536ce4f9b13f1efff71ea313c8661dd9a4ce";
var string_2 = "71946f9bbb2aeadec111841a81abc300ecaa01bd8069d5cc91005e9fe4aad6e04d513e96d99de2569bc5e50eeeca709b50a8a987f4264edb6896fb537d0a716132ddc938fb0f836480e06ed0fcd6e9759f40462f9cf57f4564186a2c1778f1543efa270bda5e933421cbe88a4a52222190f471e9bd15f652b653b7071aec59a2705081ffe72651d08f822c9ed6d76e48b63ab15d0208573a7eef027";

//copied from https://xor.pw/?
string expectedResult = "32510bfbacfbb9befd54415da243e1695ecabd58c519cd4bd90f1fa6ea5ba3624730b208d83b237176b5a41e13d1a2c0080f55d6fb05e4fd9a6e8aff84a9eec74ec0e3115dd0808c011baa15b2c29edad06d6c319976fc7c7eb6a8727e79906c96397dd14594a17511e2ba018c3267935877b5c2c1750f28b2d5bf55faa6c2218c30e58f17542717ad6f8622dd0069a4886d20d3d657a80a869c8f6025399f914f23e5ccd3a999c271a50994c7db959c5c0b73334d15ba3754e9";

BigInteger b1 = BigInteger.Parse(string_1, NumberStyles.HexNumber);
BigInteger b2 = BigInteger.Parse(string_2, NumberStyles.HexNumber);
BigInteger retVal = b1 ^ b2;
var res = retVal.ToString("X").ToLower() == expectedResult; 

猜答案是res。当然正确。 :)

【讨论】:

  • 我不明白...这对我有用,但是当我做与发送两个字符串的方法完全相同的事情时,它停止工作...我实际上是复制并粘贴这段代码,然后将string_1string_2 参数改为...
猜你喜欢
  • 1970-01-01
  • 2012-06-22
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
相关资源
最近更新 更多