尝试对2个十六进制数进行XOR以创建唯一的十六进制数
离。 7F4 ^ 65D等于1A9
我理解XOR应该如何工作,但每次我尝试转换字符串十六进制数:
string hex1 = "7F4";
int hexInt = Convert.ToInt32(hex1, 16);
我最终得到一个数字:2036
如何保持十六进制数的完整性,以便我可以对2个十六进制数进行异或?
答案 0 :(得分:8)
数字是一个数字,十六进制就是数字的显示方式。
7F4十六进制等于2036十进制,你可以对它执行按位运算,它们将产生正确的输出。
答案 1 :(得分:4)
将十六进制字符串转换为普通整数,对整数执行XOR,然后将结果整数格式化为十六进制字符串。
string hex1 = "7F4";
string hex2 = "65D";
int dec1 = Convert.ToInt32(hex1, 16);
int dec2 = Convert.ToInt32(hex2, 16);
int result = dec1 ^ dec2;
string hexResult = result.ToString("X");
答案 2 :(得分:2)
2036 base 10 IS 0x7F4 base 16。
它们都是相同位模式的表示:
0000 0111 1111 0100
0 7 F 4
/// binary:
[0*2048 + 1*1024 + 1*512 + 1*256] + [1*128 + 1*64 + 1*32 + 1*16] + [0*8 + 1*4 + 0*2 + 0*1] = 2036 (base 10)
/// hex
7*16*16 + F*16 + 4
= 7*16*16 + 15*16 + 4 = 2036 (base 10)
这样做:
int a = Convert.ToInt32("2036");
int b = Convert.ToInt32("07F4",16);
Console.WriteLine("Same? "+(a==b ? "true" : "false"));
将这两个变量中的任何一个与任何东西进行异或运算会得到相同的结果。
答案 3 :(得分:1)
我认为您将数字的字符串表示与数字本身混淆。
2036 IS 7F4 ......它们的价值相同。现在,当您使用Convert.ToInt32
转换值然后在调试器中查看结果时,您可能看到 base10中的值 - 但这无关紧要。转换运行正常。
对值的按位运算将产生正确的结果。例如:
int result = 2036 ^ 1985; // results in 53 decimal or 0x035 hex
如果需要将值转换回Hex字符串,可以使用:
string asHexAgain = hex1.ToString("x");
答案 4 :(得分:0)
尝试使用int.Parse
方法中的NumberStyle规范:
int value = int.Parse("7F4",NumberStyles.AllowHexSpecifier);
这将为您提供十六进制数的十进制值。现在要将其作为十六进制数字返回,您可以这样做:
string hex = value.ToString("X2");
答案 5 :(得分:0)
2036和0x7f4只是相同数字的不同表示。你仍然可以用另一个号码对它进行异或。
答案 6 :(得分:0)
表示数字的基数无关紧要。数字15基数10(十进制)和数字0xF(十六进制)是相同的数字。只是使用不同的基础来代表它们。 Visual Studio通常会向您显示十进制数字,因为这是人类习惯的数字。
所以XOR'ing hexInt将正常工作。然后,您可以将其转换为十六进制格式的字符串。