我读到某处字符串0123456789ABCDEFFEDCBA987654321089ABCDEF01234567是192位(24)。它写的是“字节的十六进制表示”
我需要这个概念的帮助。
PS:这是TripleDES算法的密钥。
答案 0 :(得分:4)
在十六进制数字中,您有16个不同的数字。这些是首先使用用于十进制数字的普通10个符号,0到9.然后使用拉丁字母的前六个字母,即A到F.
由于每个数字代表0到F范围内的值,即16种可能性中的一种,它保持4位信息。因此,在一个长十六进制数字字符串中,您可以计算信息的总位数,只是存在的位数的四倍。
您的示例字符串“0123456789ABCDEFFEDCBA987654321089ABCDEF01234567”为48位数字。这意味着它是一个48 * 4 = 192位的数字,采用十六进制格式。
如果您有兴趣将这个大数字视为一个字节序列,只需要成对数字,因为每个字节都是8位。第一个(从左边开始计算)几个字节然后变为0x01
,0x23
,0x45
,依此类推。
答案 1 :(得分:2)
这只是一个很大的数字。您习惯使用的数字(例如“192”)之间的唯一区别在于它是使用hexadecimal number system而不是decimal number system编写的。十六进制数字系统使用16位数字(0-9和A-F)而不是您习惯使用的10位数字(0-9)。
该特定数字相当于十进制表示法中的27898229935051914480226618602452055732231960245295072615。
答案 2 :(得分:2)
约阿希姆已经解释了理论概念。如果您想在Java中自己使用这些数字,请查看java.math.BigInteger
。
,例如,将十六进制数转换为十进制数或任何其他系统:
// the "radix" is 16 because the string represents a hexadecimal number
BigInteger bi = new BigInteger(
"0123456789ABCDEFFEDCBA987654321089ABCDEF01234567", 16);
// print the number in decimal (digits 0-9)
System.out.println(bi.toString(10));
// print the number in octal (digits 0-7)
System.out.println(bi.toString(8));
答案 3 :(得分:1)
0123456789ABCDEF FEDCBA9876543210 89ABCDEF01234567
3(十六进制)密钥又称3 * 8
字节或3 * 8 * 8 = 192
位。
答案 4 :(得分:1)
十六进制中的每个字符对应4位。因此,对于您的示例,有48个字符,48 * 4 = 192位。
答案 5 :(得分:1)
关于你的第二个问题:JVM如何区分不同基数的数字?
它没有也不能这样做!作为程序员,您必须支持JVM。如果指定小常量,则使用前缀来表示十进制,八进制或十六进制基数:
// A leading zero signals a constant in octal base;
// octal 46 is decimal 38
final int n1 = 046;
// A leading "0x" signals a constant in hexadecimal base;
// hex 3f is decimal 63
final int n2 = 0x3f;
// No prefix refers to a regular decimal number
final int n3 = 12;
只有八进制,十进制和十六进制基数的前缀,因为这些是程序员最常使用的。注意,二进制常量没有前缀!
如果您像我之前对第一个问题的回复中那样使用java.math.BigInteger
类,那么您必须在构造函数中指定基类:
// input numbers in octal, decimal, and hexadecimal;
// Java needs your help to recognize the base!
final BigInteger b8 = new BigInteger("12345", 8);
final BigInteger b10 = new BigInteger("12345", 10);
final BigInteger b16 = new BigInteger("12345", 16);
// output them in decimal system
System.out.println(b8.toString()); // prints "5349"
System.out.println(b10.toString()); // prints "12345"
System.out.println(b16.toString()); // prints "74565"