rust和python的转换
bytes 和 np.recarray
pythonn
示例1
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | import numpy as np
data = np.array(
[(1, 2), (600001, 1000)],
dtype=np.dtype([("code", "<u4"), ("open", "<u4")])
)
data = np.recarray(shape=data.shape, dtype=data.dtype, buf=data.data)
data_bytes = data.tobytes()
print(data_bytes)
raw_data = np.frombuffer(data_bytes, dtype=np.dtype([("code", "<u4"), ("open", "<u4")]))
print(raw_data)
|
输出结果
| b"\x01\x00\x00\x00\x02\x00\x00\x00\xc1'\t\x00\xe8\x03\x00\x00"
[( 1, 2) (600001, 1000)]
|
u8 序列为[1, 0, 0, 0, 2, 0, 0, 0, 193, 39, 9, 0, 232, 3, 0, 0]
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | #[repr(C, packed(1))]
#[derive(Debug, Copy, Clone)]
pub struct DDefTick {
code: u32,
open: u32,
}
pub fn data_to_u8<T>(data: &Vec<T>) -> Vec<u8> {
let mut result = Vec::new();
for item in data.iter() {
let ptr = unsafe { std::mem::transmute::<&T, *const u8>(&item) };
let slice = unsafe { std::slice::from_raw_parts(ptr, std::mem::size_of::<T>()) };
result.extend_from_slice(slice);
}
result
}
fn main() {
let mut v = vec![];
v.push(DDefTick { code: 1, open: 2 });
v.push(DDefTick { code: 600001, open: 1000 });
let bytes = data_to_u8(&v);
println!("{:?}", bytes);
let ans = bytes::Bytes::copy_from_slice(&bytes);
println!("{:?}", ans);
}
|
输出结果:
| [1, 0, 0, 0, 2, 0, 0, 0, 193, 39, 9, 0, 232, 3, 0, 0]
b"\x01\0\0\0\x02\0\0\0\xc1'\t\0\xe8\x03\0\0"
|
示例2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | import numpy as np
dtype_list = [
("code", "<u4"),
("open", "<u4"),
("bid_vol", "<u4", (5,))
]
data = np.array(
[(1, 2, [1, 2, 3, 4, 5]), (600001, 1000, [5, 4, 3, 2, 1])],
dtype=np.dtype(dtype_list)
)
data = np.recarray(shape=data.shape, dtype=data.dtype, buf=data.data)
data_bytes = data.tobytes()
print(data_bytes)
raw_data = np.frombuffer(data_bytes, dtype=np.dtype(dtype_list))
print(raw_data)
print(raw_data.dtype)
print(raw_data.shape)
|
输出结果:
| b"\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\xc1'\t\x00\xe8\x03\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00"
[( 1, 2, [1, 2, 3, 4, 5]) (600001, 1000, [5, 4, 3, 2, 1])]
[('code', '<u4'), ('open', '<u4'), ('bid_vol', '<u4', (5,))]
(2,)
|
示例3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 | import numpy as np
data_bytes = b"\x01\0\0\0\xd0\x8f^\0 \xd6^\0@\x8e^\0XX^\0\xc0\xfe^\0\xb0.]\0pT^\0XX^\0\xb6#^\0\x0bk\x01\0\0\0\0\0A\x80\x01\0\0\0\0\0\x8bb4\x01\xf0I\x02\0"
raw_data = np.frombuffer(
data_bytes,
dtype=np.dtype(
[
("code", "<u4"),
("open", "<u4"),
("pre_close", "<u4"),
("pre_settle", "<u4"),
("price", "<u4"),
("high", "<u4"),
("low", "<u4"),
("bid_price", "<u4"),
("ask_price", "<u4"),
("avg_price", "<u4"),
("hold_vol", "<u8"),
("pre_hold_vol", "<u8"),
("date", "<u4"),
("time", "<u4"),
]
),
)
print(raw_data)
print(raw_data.shape)
print(raw_data.dtype)
print(raw_data[0])
|