27

How can I create a String object from a byte array

byte arr[MAX_SIZE];  // Java

where one of the array elements is a C null terminating byte? Is it as simple as calling

String str = new String( arr );

Will the String constructor know to automatically stop at the null terminating character? Any bytes after the null byte are (possibly) garbage characters that I don't want to include in the string. The last response under Parsing byte array containg fields of unknown length suggests looping through the array and manually finding the null terminating character, but I was wondering whether the String constructor will do this automatically. I also assume the system's default charset will be used on all ends.

Community
  • 1
  • 1
Phillip
  • 5,366
  • 10
  • 43
  • 62

4 Answers4

23
byte arr[] = ...
Charset charset = ...

// Find the position of the first zero byte
int i;
for (i = 0; i < arr.length && arr[i] != 0; i++) { }


String str = new String(arr, 0, i, charSet);

Notes:

  • It is generally a good idea to use an explicit CharSet parameter so that your application doesn't depend on the platform's default characterset / encoding.

  • This won't work for some charsets. For instance, a UTF-16 encoded string can't safely be represented as a zero-terminated byte sequence because many code units contain zero bytes. (On the other hand, UTF-8 is OK provided that the string contains no instances of code point zero; see Can UTF-8 contain zero byte?)

... but I was wondering whether the String constructor will do this automatically.

No it / they won't. (Don't "wonder" ... read the javadoc :-))

I also assume the system's default charset will be used on all ends.

If you don't specify a charset, the Java platform's default will be used. This is likely to be the system default, but that is not guaranteed.

Stephen C
  • 698,415
  • 94
  • 811
  • 1,216
13

try this: String s = new String(arr).trim()

Eric
  • 446
  • 8
  • 11
  • trim() removes the null character at the end of my strings just fine... – Peter Feb 27 '17 at 22:58
  • 2
    trim() will only work if all characters at the end of the array are zero (e.g [65, 66, 67, 0, 0, 0]: this converts to "ABC") but not with junk characters after the terminator (e.g. [65, 66 ,67, 0, -12, 10 , 33]). – Sanjeev Mar 05 '19 at 19:07
11

how about this:

String str = new String(arr).split("\0")[0];
davogotland
  • 2,718
  • 1
  • 15
  • 19
  • 5
    Doesn't look too good if the input array is huge, unless you are going to read all the strings anyway. – sjr Jan 12 '12 at 22:31
  • This is making assumptions about the default charset. And it is creating a large temporary string, an array an potentially a large number of unnecessary strings for the stuff after the first null. – Stephen C Aug 30 '21 at 23:02
4

It won't magically stop at the null terminator. The null character doesn't terminate strings in Java. You will have to find the index of the first null character and stop there. Use the String(byte[] arr, int offset, length) constructor after that.

sjr
  • 9,769
  • 1
  • 25
  • 36