2017-11-02 1 views
1

Ich habe die folgende Zeichenfolge in meinen beiden PHP und C++ Skripte:C++ HexToBin VS PHP Hex2Bin Funktionen. Verschiedene Ausgabe

152F302436152F302435152F302434152F302433152F302433 

In PHP ich die eingebauten in HEX2BIN Funktion als:

<?php 
    $HEXString = "152F302436152F302435152F302434152F302433152F302433"; 
    echo hex2bin($HEXString); 
    //Outputs: /0$6/0$5/0$4/0$3/0$3 
    ?> 

jedoch in C++ Ich verwende die

const char* HexCharToBin(char c) { 
    char cUpper = toupper(c); 
    if (cUpper == '0') return "0000"; 
    else if (cUpper == '1') return "0001"; 
    else if (cUpper == '2') return "0010"; 
    else if (cUpper == '3') return "0011"; 
    else if (cUpper == '4') return "0100"; 
    else if (cUpper == '5') return "0101"; 
    else if (cUpper == '6') return "0110"; 
    else if (cUpper == '7') return "0111"; 
    else if (cUpper == '8') return "1000"; 
    else if (cUpper == '9') return "1001"; 
    else if (cUpper == 'A') return "1010"; 
    else if (cUpper == 'B') return "1011"; 
    else if (cUpper == 'C') return "1100"; 
    else if (cUpper == 'D') return "1101"; 
    else if (cUpper == 'E') return "1110"; 
    else if (cUpper == 'F') return "1111"; 
    else return "0000"; 
    } 
string HexToBin(const string& hex) { 
    string bin; 
    for (unsigned i = 0; i != hex.length(); ++i) { 
     bin += HexCharToBin(hex[i]); 
     } 
    return bin; 
    } 

Der Code in C++:: folgende Funktionen derselben mit einem anderen vollständigen Ergebnis zu erreichen

cout << HexToBin("152F302436152F302435152F302434152F302433152F302433") << endl; 
//Outputs: 00010101001011110011000000100100001101100001010100101111001100000010010000110101000101010010111100110000001001000011010000010101001011110011000000100100001100110001010100101111001100000010010000110011 

Ich möchte, dass C++ die gleiche Zeichenfolge wie PHP zurückgibt. Was mache ich hier falsch?

+0

C++ und PHP sind zwei völlig verschiedene Sprachen. Das Ziehen von Parallelen zwischen beiden kann sich als kontraproduktiv erweisen. – Ron

+1

Nicht mit PHP vertraut, aber wie '/ 0 $ 6/0 $ 5/0 $ 4/0 $ 3/0 $ 3' '' 152F302436152F302435152F302434152F302433152F302433 "'? –

+0

@StephanLechner, keine Ahnung, aber so scheint die hex2bin-PHP-Funktion zu funktionieren ... –

Antwort

0

Wenn Sie nur eine Hexadezimalzahl in eine Binärzahl konvertieren möchten, verwenden Sie base_convert().

Lesen Sie die hex2bin php documentation vorsichtig zitiert:

Vorsicht diese Funktion nicht eine hexadezimale Zahl in eine binäre Zahl konvertieren. Dies kann mit der Funktion base_convert() geschehen.

Diese Funktion einfach

Dekodiert eine hexadezimal Binärkette codiert.

Da Ihre Zeichenfolge keine hexadezimal codierte Zeichenfolge ist, erhalten Sie eine unerwartete/andere Ausgabe.

Um das Verhalten von PHP zu replizieren hex2bin können folgende Beitrag Ihnen helfen: Missing punctuation from C++ hex2bin

Hoffe, es half.

+0

Danke für den Kommentar. Allerdings möchte ich das Verhalten von PHP in C++ implementiert haben. Wie kann ich das erreichen? Also, im Grunde brauche ich C++, um die gleiche Ausgabe wie PHP zu generieren –

+0

@TVAvanHesteren: Bitte überprüfen Sie den aktualisierten Link. Es kann dir helfen. –

+0

Ich habe versucht den Link und wenn ich meine HEXString eingeben gibt es mir nicht die gleiche Ausgabe wie PHP tut? –

0
<?php 
    $HEXString = "152F302436152F302435152F302434152F302433152F302433"; 
    echo base_convert(hex2bin($HEXString), 16, 2); 
?> 

Ich denke, dieser Ansatz würde zurückkehren, was Sie suchen, oder Sie können die gleiche Funktion, die Sie gemacht auf C++ auf PHP Array so einfach machen:

$base = array(
'1'=>"0001", 
'2'=>"0010", 
'3'=>"0011", 
... 
); 
function HexToBin($string) { 
$len = strlen($string); 
$bin; 
    for ($i = 0; $i < $len; $i++) { 
     $bin += $base[$string[$i]]; 
     } 
    return $bin; 
    } 
echo HexToBin("152F302436152F302435152F302434152F302433152F302433"); 
//Outputs: 00010101001011110011000000100100001101100001010100101111001100000010010000110101000101010010111100110000001001000011010000010101001011110011000000100100001100110001010100101111001100000010010000110011 
0

Ich möchte C++ um die gleiche Zeichenfolge wie PHP zurück zu erhalten. Was mache ich gerade falsch hier?

was zu tun ist, wenn Sie, dass die PHP-Ausgabe wissen die falsche ausgegeben wird, und das ist nicht ein, aber in PHP, dann ist es das normale Verhalten von hex2bin Funktion.

müssen Sie zunächst Ihre hex string in einen Dezimalwert konvertieren mit hexdec und danach konvertieren Sie Ihre Dezimalzahl in Binär mit decbin.

$hex = decbin(
    hexdec("152F302436152F302435152F302434152F302433152F302433") 
); 
echo $bin; 

dies ein Problem verursachen, weil die PHP integer limitation

im decbin Handbuch Seite, die Sie Parameters section navigieren können mehr darüber wissen.


können Sie eine PHP-Funktion schreiben das gleiche Ergebnis wie C++ Seite zu erreichen, oder verwenden GMP Erweiterung der Prober Ausgabe aus dem obigen Beispiel zu erhalten.

function _hex2bin($hex) 
{ 
    $hex = strtoupper($hex); 
    $hexLen = strlen($hex); 
    $bin = []; 
    for ($i = 0; $i < $hexLen; $i++) { 
     $char = $hex[$i]; 
     if ($char == '0') $bin[] = "0000"; 
     else if ($char == '1') $bin[] = "0001"; 
     else if ($char == '2') $bin[] = "0010"; 
     else if ($char == '3') $bin[] = "0011"; 
     else if ($char == '4') $bin[] = "0100"; 
     else if ($char == '5') $bin[] = "0101"; 
     else if ($char == '6') $bin[] = "0110"; 
     else if ($char == '7') $bin[] = "0111"; 
     else if ($char == '8') $bin[] = "1000"; 
     else if ($char == '9') $bin[] = "1001"; 
     else if ($char == 'A') $bin[] = "1010"; 
     else if ($char == 'B') $bin[] = "1011"; 
     else if ($char == 'C') $bin[] = "1100"; 
     else if ($char == 'D') $bin[] = "1101"; 
     else if ($char == 'E') $bin[] = "1110"; 
     else if ($char == 'F') $bin[] = "1111"; 
     else $bin[] = "0000"; 
    } 

    return implode("", $bin); 
} 

echo _hex2bin("152F302436152F302435152F302434152F302433152F302433"); 

Live-Beispiel: https://3v4l.org/IkRmG

oder noch kürzer:

function _hex2bin($hex) 
{ 
    $hex = strtoupper($hex); 
    $hexLen = strlen($hex); 
    $bin = []; 
    for ($i = 0; $i < $hexLen; $i++) { 
     $char = $hex[$i]; 
     $bin[] = str_pad(base_convert($char, 16, 2), 4, '0', STR_PAD_LEFT); 
    } 

    return implode("", $bin); 
} 

echo _hex2bin("152F302436152F302435152F302434152F302433152F302433"); 

Live-Beispiel: https://3v4l.org/MoH8R

Verwandte Themen