Thema: Byte Array
Einzelnen Beitrag anzeigen
  #8 (permalink)  
Alt 05-07-2015, 13:43
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von Koda Beitrag anzeigen
Ich suche eine Funktion in PHP um einen Byte Array zu erstellen und diesen per Base64 noch zu encoden.
Das sind zwei Aufgabenstellungen, die du getrennt betrachten solltest.

Zitat:
In #C gibt es diese Funktion:
Convert.ToBase64String(new byte[] {5, 7})

Gibt es sowas auch in PHP oder kennt jemand ne möglichkeit dafür?
Mit ein wenig Boilerplate könnte man zu so etwas kommen:
PHP-Code:
Convert::toBase64String(new Bytes([57])) 
Dazu der Unterbau:
PHP-Code:
interface IConvertible {
    function 
__toString();
}

abstract class 
Convert {
    static function 
toBase64String(IConvertible $bytes) {
        return 
base64_encode($bytes);
    }
}

abstract class 
ArrayOfInt implements IConvertible {
// todo: implement ArrayAccess, Iterator, Countable

    // limits
    
const minValue PHP_INT_MIN;
    const 
maxValue PHP_INT_MAX;

    
// properties
    
protected $ary null/// Array() of Int(minValue...maxValue)

    
protected function containsValidValuesOnly(Array $ary) {
        foreach (
$ary as $value) {
            if (
$value $this::minValue || $value $this::maxValue) {
                return 
false;
            }
        }
        return 
true;
    }

    function 
__construct(Array $ary$check true) {
        if (
$check && !$this->containsValidValuesOnly($ary)) {
            throw new 
Exception('Invalid Value Error');
        }
        
$this->ary $ary;
    }

    const 
packformat 'C*'// UBYTE

    // implement IConvertible

    
function __toString() {
        
$values $this->ary;
        
array_unshift($values$this::packformat);
        return 
call_user_func_array('pack'$values);
    }
}

class 
Bytes extends ArrayOfInt {
    
// limits
    
const minValue 0;
    const 
maxValue 255;
    const 
packformat 'C*'// UBYTE

Eventuell etwas viel Umstand für wenig Ergebnis ...

Zurück zu den zwei Problemstellungen:

1.) Du möchtest mit Byte-Arrays arbeiten. PHP hat so eine Datenstruktur nicht (serienmäßig eingebaut). Wir haben Arrays, eine Art eierlegende Wollmilchsau. Eine Datenstruktur die von allem etwas (aber nichts richtig) kann. Arrays in PHP dienen als:
* Assoziative Arrays (Mapping, Dictionary, ...)
* Listen (Felder, C-like Arrays, ...)

Der Datentyp, den ein PHP-Array simuliert, wird quasi durch die Funktionen und Operatoren bestimmt, die du auf das Array anwendest.

1a.) Wie h3ll schon angemerkt hat, kann man Byte-Arrays in PHP auch mit Strings simulieren. Derzeit sind PHP-Strings einfach Speicherbereiche, auf deren Byte-Positionen man mit der []-Operation zugreifen kann. Quelle und Ziel dieser Operationen sind aber immer PHP-Strings (mit der Länge 1 Byte). Wenn du gewohnt bist, mit Ganzzahl-Typen (UBYTE, UCHAR e.t.c.) zu arbeiten, musst du zusätzlich chr() und ord() für Einzel-Bytes benutzen. Für das Konvertieren ganzer Arrays gibts entsprechend pack() und unpack(). Beide Funktionen sind allerdings mit einigen Stolperfallen versehen.

2.) Fürs Base64-Encoding hat PHP base64_encode() in seiner Standard-Library. Allerdings stellt sich die Frage, worauf in deiner Anwendung der Fokus liegt:
* auf dem Arbeiten mit Byte-Arrays, wie du es von C# gewohnt bist,
* oder auf dem Konvertieren von Byte-Arrays?
Im letzteren Fall fährst du mit PHP-Strings besser.

Prinzipiell kann man von PHP aus über die COM-Erweiterung auch Objekte aus .NET-Assemblies erzeugen und benutzen. Allerdings funktioniert das nicht mit Klassen die ausschließlich "statische" Methoden besitzen (wie "Console" und "Convert"), nur mit Methoden, die als "COM visible" deklariert wurden und nur mit "echten" Objekten (nicht mit "structs"). Ob es mit dem Equivalent zu "byte[]" klappt, weiß ich nicht.

Geändert von fireweasel (05-07-2015 um 13:54 Uhr)
Mit Zitat antworten