# String in Binärcode umwandeln



## Radhad (18. Juni 2007)

Hallo zusammen,

ich hab ein kleines Problem bei dem ich nicht weiter komme. Ich habe einen String mit Buchstaben und Zahlen und möchte diesen in Binärcode umwandeln, da der Binärcode dann bestimmte Zahlen (ID's) darstellt. Nur wiewandel ich den String in Binary um? Im Manual hab ich dazu keine Funktion gefunden.


Gruß Radhad


----------



## Flex (18. Juni 2007)

```
function str2bin($str, $mode=0) {
    $out = false;
    for($a=0; $a < strlen($str); $a++) {
        $dec = ord(substr($str,$a,1));
        $bin = '';
        for($i=7; $i>=0; $i--) {
            if ( $dec >= pow(2, $i) ) {
                $bin .= "1";
                $dec -= pow(2, $i);
            } else {
                $bin .= "0";
            }
        }
        /* Default-mode */
        if ( $mode == 0 ) $out .= $bin;
        /* Human-mode (easy to read) */
        if ( $mode == 1 ) $out .= $bin . " ";
        /* Array-mode (easy to use) */
        if ( $mode == 2 ) $out[$a] = $bin;
    }
    return $out;
}
```

Die Funktion hab ich gefunden auf der Seite im PHP Manual für String Funktionen. Hatte sie mir damals rauskopiert, weil ich dachte, die ist bestimmt nochmal nützlich 
Hat meiner Meinung nach alles was man braucht.


----------



## Gumbo (18. Juni 2007)

Du könntest auch die unpack()-Funktion nutzen:
	
	
	



```
$packed = unpack('C*', 'foobar');
array_walk($packed, create_function('&$var', 'return $var = (string) sprintf("%08b", $var);'));
var_dump(implode('', $packed));
```


----------



## Radhad (18. Juni 2007)

In der Funktion muss irgendwie ein Fehler sein, denn der gleiche String mit einem Testprogramm in C# ergibt einen anderen Binärcode. Der Binärcode, der bei dieser Funktion rauskommt ist nicht richtig.


----------



## Radhad (18. Juni 2007)

Kann das Problem damit zusammen hängen, dass der String ein Base64 String ist?

EDIT:
Ok, ich bin das ganze ja komplett falsch angegangen ^^ Ich muss zuerst den Base64 String decoden und dann in Binärcode umwandeln ^^
EDIT2:
base64_decode geht nicht, also muss ich wohl die Zeichen manuell austauschen, also A = 0, B = 1, C = 2 etc. - Wie könnte ich dies am besten machen?


----------



## Gumbo (18. Juni 2007)

Wie sieht denn die Eingabe und wie die erwartete Ausgabe aus?


----------



## Radhad (18. Juni 2007)

Also der Base64 String sieht so aus:
OwpjMueWKPB4s9AGNf70fMQBA

Als Ausgabe sollte kommen:
011100000011100101110001001100011101011110011010010100111100100000000111001101101111000000011000101100111110110111001011111110001100000010100000000000
Bekomme aber
01001111011101110111000001101010010011010111010101100101010101110100101101010000010000100011010001110011001110010100000101000111010011100110011000110111001100000110011001001101010100010100001001000001

Da ich derzeit direkt Binär umwandle anstatt die Buchstaben den Zahlen zuordne (ich vermute daran hapert es derzeit noch)


Entsprechende RFC 3548


----------



## Flex (18. Juni 2007)

Für das Umwandeln würde ich [phpf]chr[/phpf] verwenden.


```
$string = "0123"; # A B C D
$output = false;
for($i = 0; $i < strlen($string); $i++) {
	$output .= chr(substr($string, $i, 1) + 65);
}	

echo $output;
```


----------



## Radhad (18. Juni 2007)

Ich hab jetzt hier 2 Arrays:

```
$Base64_Encode = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/");
$Base64_Value = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63");
```
Jetzt müsste ich die einzelnen Zeichen des Base64 codierten Strings austauschen mit den Zahlen aus den Array "Base64_Value".

Ich dachte an

```
$str = str_replace($Base64_Encode, $Base64_Value, $str);
```
aber das klappt nicht.


----------



## Flex (18. Juni 2007)

```
<?php
$str = 'OwpjMueWKPB4s9AGNf70fMQBA';

$Base64_Encode = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", 
"S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", 
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/");
$Base64_Value = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", 
"17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", 
"56", "57", "58", "59", "60", "61", "62", "63");

echo $str."<br/>";
echo str_replace($Base64_Encode, $Base64_Value, $str)."<br/>";
echo str_replace($Base64_Value, $Base64_Encode, $str);


?>
```

Die Ausgabe klappt bei mir ohne Probleme und er wandelt auch richtig zurück?


----------



## Radhad (18. Juni 2007)

Ja das schon, er wandelt es richtig zurück, nur ist O = 14 (der erste Buchstabe im String) und die ersten Zahlen sind 5561 ^^ Das kann ja nicht richtig sein.


```
$str = 'OwpjMueWKPB4s9AGNf70fMQBA';

$Base64_Encode = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", 
"S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", 
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/");
$Base64_Value = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", 
"17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", 
"56", "57", "58", "59", "60", "61", "62", "63");

echo $str."<br/>";
for($i = 0; $i < strlen($str); $i++)
{
	echo substr($str, $i, 1)." = ".str_replace($Base64_Encode, $Base64_Value, substr($str, $i, 1))."<br>";
}
echo str_replace($Base64_Value, $Base64_Encode, $str);
```
Da kann man es selber sehen, O ist nicht 14 sondern 5561556155615561560. Ich brauch aber die 14 ^^


----------



## Flex (18. Juni 2007)

Keine Ahnung warum str_replace so reagiert in diesem Fall, aber so funktioniert es.


```
$test = false;
$Base64_Enc = array_flip($Base64_Encode);
for($i = 0; $i < strlen($str); $i++) {
	echo $str{$i}."-";
	echo $Base64_Enc[$str{$i}]."<br/>";
	#$test .= $Base64_Enc[$str{$i}];
}
```


----------



## Michael Engel (18. Juni 2007)

Scheinbar kommt die str_replace nicht so ganz damit klar das der string länger wird und ersetzt mehrfach. So funktioniert es zumindest:


```
$str = 'OwpjMueWKPB4s9AGNf70fMQBA';

$Base64_Encode = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", 
"S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", 
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/");
$Base64_Value = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", 
"17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", 
"56", "57", "58", "59", "60", "61", "62", "63");

$Encode = array_combine($Base64_Encode, $Base64_Value);

for($i = 0; $i < strlen($str); $i++)
{
    $new_str  .= $Encode[$str{$i}];    
}
echo $new_str;
```


Eine andere frage: Kannst du das überhaupt noch zurückkonvertieren? Woher soll er 1 - 1 (eins eins also BB) von 11 (elf also L) unterscheiden? währe da 01 nicht besser?


----------



## Radhad (18. Juni 2007)

Cool, so hat es wunderbar geklappt. Ist zwra decodieren statt encodieren, aber ok 

Dann müsste ich bei deinem Beispiel

```
$Encode = array_combine($Base64_Encode, $Base64_Value);
```
in

```
$Encode = array_combine($Base64_Value, $Base64_Encode);
```
um es wieder umzuwandeln, oder? Ich versuch das mal 

[EDIT]
Ne, so geht's nicht... Die Rückwandlung ist schwierig, da müsste ich wohl über die Binärzahlen gehen. Kann ich den auch noch "zwingen" dass jede Zahl 8-Stellig ist (also 8 Bit sollen dargestellt werden).


----------



## Michael Engel (18. Juni 2007)

Genau das wollte ich bemängeln oben bei deiner Ausgabe ,)

die SOLL ist mit verschieden vielen stellen immer wieder, also irgendwas scheint da wohl auch noch absolut nicht zu stimmen, aber aus dem PHP raus immer 8 stellig währe das:



```
$str = 'OwpjMueWKPB4s9AGNf70fMQBA';

$Base64_Encode = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", 
"S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", 
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/");
$Base64_Value = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", 
"17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", 
"56", "57", "58", "59", "60", "61", "62", "63");

$Encode = array_combine($Base64_Encode, $Base64_Value);

for($i = 0; $i < strlen($str); $i++)
{
    $new_str  .= str_pad(decbin($Encode[$str{$i}]), 8, 0, STR_PAD_LEFT);    
}

echo $new_str;
```

Gibt bei mir:

0001110001100000010100100100011000011000010111000011110000101100000101000001111000000010011100000101100001111010000000000000110000011010001111100111011001101000001111100001100000100000000000100000000


EDIT:

Rück verwandeln must du eben aufpassen wenn deine Zahl mehr als eine Stelle hat, wahrscheinlich fährst du besser wenn du es mit str_split oder so in 8-ter Häppchen aufteilst und dann als ein array verarbeitest, so in etwa:


```
$Decode = array_combine($Base64_Value, $Base64_Encode);
$back = str_split($new_str, 8);
for ($i = 0; $i < count($back); $i++){
    $back[$i] = $Decode[bindec($back[$i])];
}
$back = implode($back);
echo $back;
```

und wir haben wieder: OwpjMueWKPB4s9AGNf70fMQBA


----------



## Radhad (18. Juni 2007)

Ok, ist doch komplexer als ich dachte 

http://gw.gamewikis.org/wiki/Skill_Template_format#Octal_to_base_64
Ich muss auch noch bei jeder Zahl die Reihenfolge der Bits umdrehen, also quasi Rückwärts hinschreiben... Ich glaub ich muss da eher mal den Bekannten von mir kontaktieren, wie der das gemacht hat :/


----------



## Radhad (18. Juni 2007)

So, ich hab das Problem hinbekommen *g*


```
$str = 'AxNREp8XH/CgJwEBBAAAXmAA';

$Base64_Encode = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", 
"S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", 
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/");
$Base64_Value = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", 
"17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", 
"56", "57", "58", "59", "60", "61", "62", "63");

echo $str."<br/>";
$Decode = array_combine($Base64_Encode, $Base64_Value);

for($i = 0; $i < strlen($str); $i++)
{
	$new_str .= $Decode[$str{$i}];
	$new_str .= " ";
	$Binary_String .= strrev(str_pad(decbin($Decode[$str{$i}]), 6, 0, STR_PAD_LEFT));
}
echo $new_str."<br>";
echo $Binary_String."<br>";
echo "000000100011101100100010001000100101001111111010111000111111010000000001100100000011001000100000100000000000000000000000111010011001000000000000";
```
Dein Rück-Convertieren muss ich dann nur entsprechend anpassen. Danke für die Hilfe!


----------



## Michael Engel (18. Juni 2007)

EDIT: sry hatte antwortenfenter schon offen ^^

Soo nochmal genauer angeschaut, stimmt.

Also es sind immer 6 stellen nicht 8 und eben gedreht, aber kein Problem:


```
<?

$str = 'OwpjMueWKPB4s9AGNf70fMQBA';
$Base64_Encode = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", 
"S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", 
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/");
$Base64_Value = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", 
"17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", 
"56", "57", "58", "59", "60", "61", "62", "63");

$Encode = array_combine($Base64_Encode, $Base64_Value);

for($i = 0; $i < strlen($str); $i++)
{
    $new_str  .= strrev(str_pad(decbin($Encode[$str{$i}]), 6, 0, STR_PAD_LEFT));    
}

echo $new_str;

$Decode = array_combine($Base64_Value, $Base64_Encode);
$back = str_split($new_str, 6);
for ($i = 0; $i < count($back); $i++){
    $back[$i] = $Decode[bindec(strrev($back[$i]))];
}
$back = implode($back);
echo "\n".$back;
?>
```

stimmt 1 zu 1 mit deinem Soll String überein


----------

