简体   繁体   中英

how to use bytes in java?

Why does this code return 221 here? What is the logic behind this? How this working? Please explain this to me for I am new to Java.

import java.io.UnsupportedEncodingException;


public class Checksrting {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        byte[] byteArray = new byte[2];
        byteArray[0] = 100;
        byteArray[1] = 100;

        Long ID = null;
        try {
            ID = Long.parseLong(new String(byteArray, "utf-8").trim(), 16);
            System.out.print(ID);
        } catch (NumberFormatException | UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

So please explain to me what is the use of utf-8 and ,16?

100 is the equivalent of the d character. So your string will become dd .

When you do

ID = Long.parseLong(new String(byteArray, "utf-8").trim(), 16);

You are converting the string to a long number, with hexadecimal format.

the decimal value for dd is 221 , that's why you get that output.


what is the use of utf-8 and ,16?

utf-8 is the character encoding that the String constructor will use to build up the string, and 16 is the radix that will be used to convert your string to a long.

"utf-8" is the character encoding, ie how a String is represented as bytes.

UTF-8 uses a variable length encoding, and ASCII characters can be represented as a single byte with 0 as highest bit. This is the case for d which is represented as 100 (in decimal notation). Since you have 2 bytes with the number 100, this translates to the string "dd"

16 is the radix used for conversion from String to Long , so this translates from strings in hex notation.

A d in hex notation is 13 in decimal notation. So dd becomes 13 * 16 + 13 = 208 + 13 = 221

As you can see in the documentation String constructor gets a parameter charset:

Constructs a new String by decoding the specified array of bytes using the specified charset. The length of the new String is a function of the charset, and hence may not be equal to the length of the byte array. 

And the 16 is the radix which is to use for the conversion: See the documentation from Long

It returns 221 because of the conversion of dd string to hexadecimal number.

new String(byteArray, "utf-8").trim();

With this statement byteArray[0] contains 100 which is converted to character its representation is 'd' as there are 2 elements in the byteArray therefore it creates the String 'dd' and converts the String into the hexadecimal code.

new String(byteArray, "utf-8").trim();

returns 'dd' then it is parsed into the Long value as the regEx parameter is given 16, therefore it converts into hexadecimal format ie; 221

Long.parseLong("dd",16);

I agree with the older answers, but am adding some advice on how to figure out this sort of issue.

First, if you are having trouble understanding a complicated expression, extract sub-expressions into local variables, and print those variables:

        String s1 = new String(byteArray, "utf-8");
        System.out.println("s1: |" + s1 + "|");
        String s2 = s1.trim();
        System.out.println("s2: |" + s2 + "|");
        ID = Long.parseLong(s2, 16);
        System.out.print(ID);

It now prints:

s1: |dd|
s2: |dd|
221

Next, look at the individual sub-expressions. If there is anything you do not understand about a call and what it did, look it up in the API documentation.

For example, you asked about the "16". The Long.parseLong(String s, int radix) documentation says: "Parses the string argument as a signed long in the radix specified by the second argument. ". The output from the modified program shows that s is "dd", so it is going to parse "dd" as a hexadecimal number. A programmer's calculator will show you that hex "dd" is decimal 221.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM