Skip to content

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)

输出结果

1
2
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
bytes = "1.0.1"
 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
2
[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)

输出结果:

1
2
3
4
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])