views:

757

answers:

7

I read somewhere that string 0123456789ABCDEFFEDCBA987654321089ABCDEF01234567 is 192 bit (24). Its written that it is a "hex representation of bytes"

I need help on this concept.

PS: This is secret key of TripleDES algorithm.

+2  A: 

It's just a big number. The only difference between the numbers you are used to (such as "192") is that it's written in using the hexadecimal number system instead of the decimal number system. The hexadecimal number system uses 16 digits (0-9 and A-F) instead of the 10 you are used to (0-9).

That particular number is equivalent to 27898229935051914480226618602452055732231960245295072615 in decimal notation.

Joachim Sauer
+2  A: 

Joachim already explained the theoretical concept. If you want to play around with such numbers yourself in Java, then take a look at java.math.BigInteger.

E.g., to convert your hexadecimal number to the decimal or any other system:

// 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));
janko
What does this return anyway? Is there any data type in Java that can handle 192 bit long integers. Pardon my ignorance, I am a .net guy.
Faiz
BigInteger is this data type. It can hold effectively arbitrary-big integer values (constrained by available memory mostly). It is similar to the `System.Decimal` type except that it has no decimal places (the exact equivalent for `System.Decimal` would be `BigDecimal` in Java).
Joachim Sauer
If it has no decimal places, wouldn't it be more similar to int or long or something?
Svish
+1  A: 
0123456789ABCDEF FEDCBA9876543210 89ABCDEF01234567

3 (hex) keys aka 3 * 8 bytes or 3 * 8 * 8 = 192 bits.

Nick D
+4  A: 

In hexadecimal numbers, you have 16 different digits. These are written using first the ordinary 10 symbols used for decimal digits, 0 through 9. Then the first six letters of the Latin alphabet are used, i.e. A through F.

Since each digit represents a value in the range 0 through F, i.e. one of sixteen possibilities, it holds four bits of information. Thus, in a long string of hex digits, you can compute the total number of bits of information as just four times the number of digits present.

Your example string, "0123456789ABCDEFFEDCBA987654321089ABCDEF01234567", is 48 digits. This means it is a 48 * 4 = 192 bit number, in hexadecimal form.

If you're interested in viewing this large number as a sequence of bytes, just take pairs of digits, since each byte is 8 bits. The first (counting from the left) few bytes then become 0x01, 0x23, 0x45, and so on.

unwind
+1  A: 

Each character in hexadecimal corresponds to 4 bits. So for your example, there are 48 characters and 48 * 4 = 192 bits.

RyanS
A: 

I am thankful to you people for helping me understand the concept. One thing I want to ask you how JVM distinguish it to a HEX representation. Not a alphanumeric combination from 0-9,A-F? Because it is enclosed in quotes like simple string.

Thank you all again.

It is a string because of the datatype declared to hold the value. It will have to be converted to another datatype if it is to be treated as a number. In this case that number exceeds 64bits so no Java datatype other than String can even hold it.
gshauger
You should post questions as questions, or edit your original question. Don't post questions as answers =)
Svish
@gshauger: The BigInteger class can hold such a number. I think...
Svish
Tahir, it looks like you have created 2 user accounts here, you should try to stick with the first you created...
awe
A: 

With regard to your second question: How does the JVM distinguish between numbers in different bases?

It does not and can not do so! You as a programmer have to support the JVM. If you specify small constants, then you use a prefix to signal either decimal, octal, or hexadecimal base:

// 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;

There are only prefixes for octal, decimal, and hexadecimal base because these are most often used by programmers. Note, that there is no prefix for binary constants!

If you use the java.math.BigInteger class like I did in my previous reply to your first question, then you have to specify the base in the constructor:

// 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"
janko