字符串中字节的十六进制表示

时间:2009-09-08 10:38:06

标签: java hex

我读到某处字符串0123456789ABCDEFFEDCBA987654321089ABCDEF01234567是192位(24)。它写的是“字节的十六进制表示”

我需要这个概念的帮助。

PS:这是TripleDES算法的密钥。

6 个答案:

答案 0 :(得分:4)

在十六进制数字中,您有16个不同的数字。这些是首先使用用于十进制数字的普通10个符号,0到9.然后使用拉丁字母的前六个字母,即A到F.

由于每个数字代表0到F范围内的值,即16种可能性中的一种,它保持4位信息。因此,在一个长十六进制数字字符串中,您可以计算信息的总位数,只是存在的位数的四倍。

您的示例字符串“0123456789ABCDEFFEDCBA987654321089ABCDEF01234567”为48位数字。这意味着它是一个48 * 4 = 192位的数字,采用十六进制格式。

如果您有兴趣将这个大数字视为一个字节序列,只需要成对数字,因为每个字节都是8位。第一个(从左边开始计算)几个字节然后变为0x010x230x45,依此类推。

答案 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"