2014-12-19 11 views
5

lese ich über eine Bibliothek (github.com/adduc/phpmodbus) und es gibt diese Funktion integer zu Little-Endian oder Big-Endian-Byte-String für die Umwandlung:Ist diese Endianness-Konvertierung korrekt?

private static function endianness($value, $endianness = 0) { 
    if ($endianness == 0) 
     return 
       self::iecBYTE(($value >> 8) & 0x000000FF) . 
       self::iecBYTE(($value & 0x000000FF)) . 
       self::iecBYTE(($value >> 24) & 0x000000FF) . 
       self::iecBYTE(($value >> 16) & 0x000000FF); 
    else 
     return 
       self::iecBYTE(($value >> 24) & 0x000000FF) . 
       self::iecBYTE(($value >> 16) & 0x000000FF) . 
       self::iecBYTE(($value >> 8) & 0x000000FF) . 
       self::iecBYTE(($value & 0x000000FF)); 
} 

Die iecBYTE Funktion nur chr($value & 0xFF) ist.

Jetzt bin ich vielleicht dick, aber die Little-Endian-Saite sieht falsch aus.
Zum Beispiel mit 0xAABBCCDD, erhalten Sie {CC}{DD}{AA}{BB}.

Ich schaute sogar auf Wikipedia nach. Sollte es nicht {DD}{CC}{BB}{AA} sein?

Der Code funktioniert obwohl, was mich wirklich verwirrt. Ist es richtig und ich verstehe es falsch?

+1

Was meinst du damit funktioniert? Könnte es vielleicht "funktionieren", aber nicht richtig funktionieren? – imtheman

+0

Vielleicht habe ich falsch verstanden, was die Methode macht, nicht sicher. Die Methode wird in der Bibliothek häufig verwendet und funktioniert ordnungsgemäß. – MightyPork

Antwort

0

Nachdem am IECType.php suchen, bemerkte ich, dass es PHP-Typen an die IEC 1131-Typen konvertiert. Little Endian speichert zuerst niedrigstwertige Bytes. Was Sie beschreiben, würde mich denken lassen, dass das System 16-Bit-Adressen verwendet.

Wenn Sie sich die wiki für Endianess in den Kommentaren über die Endianess-Funktion, dann sehen Sie einen Abschnitt unter Little-Endian namens Atomic Element Größe 16-Bit. Eine Adresse enthält zwei Bytes (CCDD) und (AABB). Die Adresse, die die (CCDD) hält, ist am wenigsten signifikant, daher würde sie zuerst aufgeführt werden.

Wenn Sie in einem 8-Bit-System arbeiteten, dann würde jedes Byte (DDCCBBAA) geordnet werden, da es ein Byte pro Adresse geben würde.

Wiki beschreibt das, was Sie in der Endianess-Funktion sehen.

 
address1| address2 
16-bits | 16-bits 
CCDD | AABB 
0

Sie haben Recht. Die Funktion ist nicht richtig, obwohl sie nahe ist. Es sieht so aus, als müssten Sie nur einige Conversions austauschen. Logischerweise ist die Little-Endian-Conversion ($ endianness == 0) nur die Umkehrung der Big-Endian-Conversion ($ endianness! = 0).

private static function endianness($value, $endianness = 0) { 
    if ($endianness == 0) //little-endian 
     return 
       self::iecBYTE($value & 0x000000FF) . 
       self::iecBYTE(($value >> 8) & 0x000000FF) . 
       self::iecBYTE(($value >> 16) & 0x000000FF) . 
       self::iecBYTE(($value >> 24) & 0x000000FF); 
    else //big-endian 
     return 
       self::iecBYTE(($value >> 24) & 0x000000FF) . 
       self::iecBYTE(($value >> 16) & 0x000000FF) . 
       self::iecBYTE(($value >> 8) & 0x000000FF) . 
       self::iecBYTE(($value & 0x000000FF)); 
} 
Verwandte Themen