# String [HEX] To ByteArray



## Gast (12. Jan 2009)

Hi,

wie würde sowas (C# code unten) genau in JAVA aussehen?:


```
static class HexStringConverter

    {

        public static byte[] ToByteArray(String HexString)

        {

            int NumberChars = HexString.Length;

            byte[] bytes = new byte[NumberChars / 2];

            for (int i = 0; i < NumberChars; i += 2)

            {

                bytes[i / 2] = Convert.ToByte(HexString.Substring(i, 2), 16);

            }

            return bytes;

        }

    }
```

lg
Gast


----------



## Landei (12. Jan 2009)

ausm Kopp und ohne Gewähr:

```
public class HexStringConverter { 

        public static byte[] toByteArray(String hexString) { 
            int numberChars = hexString.length(); 
            byte[] bytes = new byte[numberChars / 2]; 
            for (int i = 0; i < numberChars; i += 2) { 
                bytes[i / 2] = Byte.parseByte(hexString.substring(i, 2), 16)); 
            } 
            return bytes; 
        } 
}
```


----------



## Landei (12. Jan 2009)

Vielleicht geht auch einfach (für nicht allzulange Strings)

```
public class HexStringConverter { 
        public static byte[] toByteArray(String hexString) { 
            return (new java.util.BigInteger(hexString, 16)).toByteArray();
        } 
}
```


----------



## Guest (12. Jan 2009)

danke bis jetzt kann ich aber i-wie nicht so ganz nutzen


The method toByteArray cannot be declared static; static methods can only be declared in a static or top level type


----------



## Murray (12. Jan 2009)

Dann hast Du die Methode offenbar irgendwo in einer nicht-statischen Inner-Class definiert.


----------



## Guest (12. Jan 2009)

```
Source:
	public static void HexStringConverter(String HexString)
	{
		int numberChars = HexString.length();
		byte[] Bytes = new byte[numberChars /2];
		for( int i = 0; i < numberChars; i += 2 )
		{
		HexString = HexString.replace("S", "");
		Bytes[i / 2] = Byte.parseByte(HexString.substring(i,2),16);
		}
		
	}
```
mit Folgendem input wert:
C3BE203D069F64883094AB4274044A060DBF3B4FE4D61407BC343F51589D0CFDFF35F52DDFC585100CEA8F67BA443FE9E517CF681FEAF27AA25FE4984DD34E8D9C49B7DCF09B6B0A27DE1232461E118BD06F7386DE089018C77D82DEEF6F9AEF

gibt mir als Fehlermeldung:

Exception in thread "main" java.lang.NumberFormatException: Value out of range. Value:"C3" Radix:16
	at java.lang.Byte.parseByte(Unknown Source)
	at KeyImportTool.HexStringConverter(KeyImportTool.java:22)
	at KeyImportTool.main(KeyImportTool.java:126)

aus.

Woran kann das liegern???


----------



## SlaterB (12. Jan 2009)

bytes in Java laufen von -128 bis +127,
C3 liegt darüber


```
/**
     * A constant holding the minimum value a <code>byte</code> can
     * have, -2<sup>7</sup>.
     */
    public static final byte   MIN_VALUE = -128;

    /**
     * A constant holding the maximum value a <code>byte</code> can
     * have, 2<sup>7</sup>-1.
     */
    public static final byte   MAX_VALUE = 127;


public static byte parseByte(String s, int radix)
	throws NumberFormatException {
	int i = Integer.parseInt(s, radix);
	if (i < MIN_VALUE || i > MAX_VALUE)
	    throw new NumberFormatException(
                "Value out of range. Value:\"" + s + "\" Radix:" + radix);
	return (byte)i;
    }
```


----------



## Murray (12. Jan 2009)

Das liegt darin, dass in Java Bytes vorzeichenbehaftet sind: der Wertebereich geht von -128 bis 127.

Das substring-Konstrukt funktioniert so auch nur beim ersten Mal, da Substring als zweiten Parameter nicht die Länge, sondern (Endindex+1) erwartet.

So geht es:

```
String hexString = "C3BE203D069F64883094AB4274044A060DBF3B4FE4D61407BC343F51589D0CFDFF35F52DDFC585100CEA8F67BA443FE9E517CF681FEAF27AA25FE4984DD34E8D9C49B7DCF09B6B0A27DE1232461E118BD06F7386DE089018C77D82DEEF6F9AEF";
		int numberChars = hexString.length();
		byte[] bytes = new byte[numberChars /2];
		for( int i = 0; i < numberChars; i += 2) {
			bytes[i / 2] = (byte)(Integer.parseInt(hexString.substring(i,i+2),16)-128);
		}
```


----------



## Guest (12. Jan 2009)

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 194
	at java.lang.String.substring(Unknown Source)
	at KeyImportTool.HexStringConverter(KeyImportTool.java:28)
	at KeyImportTool.main(KeyImportTool.java:131)

die genante zeile 28 ist:

```
bytes[i / 2] = (byte)(Integer.parseInt(HexString.substring(i,i+2),16)-128);
```

und die zeile 131 ist:
HexStringConverter(firstByteArrayInput);

mit dem ruf ich eben:


```
public static void HexStringConverter(String HexString)
	{
	      int numberChars = HexString.length();
	      HexString = Replace(HexString, "V", "P", "S");
	      byte[] bytes = new byte[numberChars /2];
	      for( int i = 0; i < numberChars; i += 2) {
	         bytes[i / 2] = (byte)(Integer.parseInt(HexString.substring(i,i+2),16)-128);
	      } 
	}
```

auf


----------



## Gast (12. Jan 2009)

liegt die Exception an derm i ? das des zu viel wird???


----------



## SlaterB (12. Jan 2009)

wenn der String eine ungrader Anzahl Zeichen hat,
dann kann sowas offensichtlich passieren,

poste den String und vor allen dessen Länge, also numberChars


----------



## Murray (12. Jan 2009)

Wenn Replace die Länge der Strings verändern kann, dann solltest Du die Zeichenzahl erst danach ermitteln.


----------



## Guest (12. Jan 2009)

Murray respekt ^^ da bin ich ned drauf gekommen ...^^

THX

Replace entfernt ein  zeichen aus dem Hex String das ungültig ist aber immer dabei ist.


----------

