1
+ #!/usr/bin/env python
2
+
3
+ #######################################################
4
+ # Copyright (c) 2024, ArrayFire
5
+ # All rights reserved.
6
+ #
7
+ # This file is distributed under 3-clause BSD license.
8
+ # The complete license agreement can be obtained at:
9
+ # http://arrayfire.com/licenses/BSD-3-Clause
10
+ ########################################################
11
+
12
+ def reverse_char (b ):
13
+ b = (b & 0xF0 ) >> 4 | (b & 0x0F ) << 4
14
+ b = (b & 0xCC ) >> 2 | (b & 0x33 ) << 2
15
+ b = (b & 0xAA ) >> 1 | (b & 0x55 ) << 1
16
+ return b
17
+
18
+
19
+ # http://stackoverflow.com/a/9144870/2192361
20
+ def reverse (x ):
21
+ x = ((x >> 1 ) & 0x55555555 ) | ((x & 0x55555555 ) << 1 )
22
+ x = ((x >> 2 ) & 0x33333333 ) | ((x & 0x33333333 ) << 2 )
23
+ x = ((x >> 4 ) & 0x0f0f0f0f ) | ((x & 0x0f0f0f0f ) << 4 )
24
+ x = ((x >> 8 ) & 0x00ff00ff ) | ((x & 0x00ff00ff ) << 8 )
25
+ x = ((x >> 16 ) & 0xffff ) | ((x & 0xffff ) << 16 );
26
+ return x
27
+
28
+
29
+ def read_idx (name ):
30
+ with open (name , 'rb' ) as f :
31
+ # In the C++ version, bytes the size of 4 chars are being read
32
+ # May not work properly in machines where a char is not 1 byte
33
+ bytes_read = f .read (4 )
34
+ bytes_read = bytearray (bytes_read )
35
+
36
+ if bytes_read [2 ] != 8 :
37
+ raise RuntimeError ('Unsupported data type' )
38
+
39
+ numdims = bytes_read [3 ]
40
+ elemsize = 1
41
+
42
+ # Read the dimensions
43
+ elem = 1
44
+ dims = [0 ] * numdims
45
+ for i in range (numdims ):
46
+ bytes_read = bytearray (f .read (4 ))
47
+
48
+ # Big endian to little endian
49
+ for j in range (4 ):
50
+ bytes_read [j ] = reverse_char (bytes_read [j ])
51
+ bytes_read_int = int .from_bytes (bytes_read , 'little' )
52
+ dim = reverse (bytes_read_int )
53
+
54
+ elem = elem * dim ;
55
+ dims [i ] = dim ;
56
+
57
+ # Read the data
58
+ cdata = f .read (elem * elemsize )
59
+ cdata = list (cdata )
60
+ data = [float (cdata_elem ) for cdata_elem in cdata ]
61
+
62
+ return (dims , data )
63
+
64
+ if __name__ == '__main__' :
65
+ # Example usage of reverse_char
66
+ byte_value = 0b10101010
67
+ reversed_byte = reverse_char (byte_value )
68
+ print (f"Original byte: { byte_value :08b} , Reversed byte: { reversed_byte :08b} " )
69
+
70
+ # Example usage of reverse
71
+ int_value = 0x12345678
72
+ reversed_int = reverse (int_value )
73
+ print (f"Original int: { int_value :032b} , Reversed int: { reversed_int :032b} " )
0 commit comments