LargeInteger.st
changeset 15908 35c0bb53fba1
parent 15838 314ffd3696d3
child 15909 9ffe9886b91b
--- a/LargeInteger.st	Sat Jan 25 01:31:18 2014 +0100
+++ b/LargeInteger.st	Sat Jan 25 22:04:57 2014 +0100
@@ -1425,7 +1425,7 @@
 
 byteSwapped
     "lsb -> msb;
-     i.e. a.b.c.d -> d.c.b.a"
+     i.e. a.b ... y.z -> z.y. ... b.a"
 
     ^ self class digitBytes:digitByteArray MSB:true
 
@@ -1439,6 +1439,72 @@
     "Created: / 31-01-2012 / 11:07:42 / cg"
 !
 
+byteSwapped32
+    "byte swap a 32bit value; lsb -> msb;
+     i.e. a.b.c.d -> d.c.b.a
+     Useful for communication protocols"
+
+%{
+    INT swapped;
+
+    swapped = ( (__ByteArrayInstPtr(__INST(digitByteArray))->ba_element[0]) << 24)
+              | ((__ByteArrayInstPtr(__INST(digitByteArray))->ba_element[1]) << 16)
+              | ((__ByteArrayInstPtr(__INST(digitByteArray))->ba_element[2]) << 8)
+              | ((__ByteArrayInstPtr(__INST(digitByteArray))->ba_element[3]));
+    RETURN (__MKUINT(swapped));
+%}.
+
+    "
+     (LargeInteger value:16r11223344) byteSwapped hexPrintString 
+     (LargeInteger value:16r44332211) byteSwapped hexPrintString  
+     16r88776655 byteSwapped hexPrintString  
+     16r11223344 byteSwapped hexPrintString  
+    "
+
+    "Created: / 31-01-2012 / 11:07:42 / cg"
+!
+
+byteSwapped64
+    "byte swap a 64bit value; lsb -> msb;
+     i.e. a.b.c.d.e.f.g.h -> h.g.f.e.d.c.b.a
+     Useful for communication protocols"
+
+%{
+    INT swappedLO = 0;
+    INT swappedHI;
+    INT swapped;
+
+    swappedHI = ((__ByteArrayInstPtr(__INST(digitByteArray))->ba_element[0]) << 24)
+              | ((__ByteArrayInstPtr(__INST(digitByteArray))->ba_element[1]) << 16)
+              | ((__ByteArrayInstPtr(__INST(digitByteArray))->ba_element[2]) << 8)
+              | ((__ByteArrayInstPtr(__INST(digitByteArray))->ba_element[3]));
+    if (__byteArraySize(__INST(digitByteArray)) > 4) {
+        swappedLO = ((__ByteArrayInstPtr(__INST(digitByteArray))->ba_element[4]) << 24)
+                  | ((__ByteArrayInstPtr(__INST(digitByteArray))->ba_element[5]) << 16)
+                  | ((__ByteArrayInstPtr(__INST(digitByteArray))->ba_element[6]) << 8)
+                  | ((__ByteArrayInstPtr(__INST(digitByteArray))->ba_element[7]));
+    }
+
+#if __POINTER_SIZE__ == 8
+    swapped = (swappedHI<<32) | swappedLO;
+    return __MKUINT( swapped );
+#else
+    return __MKLARGEINT64(1, swappedLO, swappedHI);
+#endif
+%}.
+
+    "
+     (LargeInteger value:16r11223344) byteSwapped64 hexPrintString 
+     (LargeInteger value:16r44332211) byteSwapped64 hexPrintString  
+     (LargeInteger value:16r1122334455667788) byteSwapped64 hexPrintString  
+     (LargeInteger value:16r8877665544332211) byteSwapped64 hexPrintString  
+     16r88776655 byteSwapped hexPrintString  
+     16r11223344 byteSwapped hexPrintString  
+    "
+
+    "Created: / 31-01-2012 / 11:07:42 / cg"
+!
+
 digitAt:index
     "return 8 bits of value, starting at byte index"
 
@@ -5233,10 +5299,10 @@
 !LargeInteger class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.214 2013-12-02 18:10:35 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.215 2014-01-25 21:04:57 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.214 2013-12-02 18:10:35 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.215 2014-01-25 21:04:57 cg Exp $'
 ! !