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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
///调换u16的高低字节
pub fn swap_u16_bytes(data:u16)->u16{
(data >> 8) | (data << 8)
}
///按字调换u32的高低字节
pub fn swap_u32_bytes(data:u32)->u32{
//取出高字部分
let high_word = ((data >> 16) & 0xFFFF) as u16;
//取出低字部分
let low_word = (data & 0xFFFF)as u16;
//高字部分交换高低字节
let high_word=((high_word>>8)|(high_word<<8)) as u32;
//低字部分交换高低字节
let low_word=((low_word>>8)|(low_word<<8)) as u32;
//高字部分和低字部分合并
(low_word << 16) | high_word
}
///按字调换u64的高低字节
pub fn swap_u64_bytes(data:u64)->u64{
//按字取出u64中的各个字,word0位最低位字
let word0:u16=(data&0xFFFF) as u16;
let word1:u16=((data>>16)&0xFFFF) as u16;
let word2:u16=((data>>32)&0xFFFF) as u16;
let word3:u16=((data>>48)&0xFFFF) as u16;
//对取出的字交换高低字节,然后转换成u64
let word0=(word0>>8|word0<<8) as u64;
let word1=(word1>>8|word1<<8) as u64;
let word2=(word2>>8|word2<<8) as u64;
let word3=(word3>>8|word3<<8) as u64;
//合并输出
(word3<<48)|(word2<<32)|(word1<<16)|word0
//取出高字部分
// let high_word = ((data >> 32) & 0xFFFFFFFF) as u32;
// //下面代码是对high_word的处理
// let high_word1 = ((high_word >> 16) & 0xFFFF) as u16;
// //取出低字部分
// let low_word1 = (high_word & 0xFFFF)as u16;
// //高字部分交换高低字节
// let high_word1=((high_word1>>8)|(high_word1<<8)) as u32;
// //低字部分交换高低字节
// let low_word1=((low_word1>>8)|(low_word1<<8)) as u32;
// //高字部分和低字部分合并
// let result_high=((low_word1 << 16) | high_word1) as u64;
// //取出低字部分
// let low_word = (data & 0xFFFFFFFF)as u32;
// //取出low_word中高字部分
// let high_word1 = ((low_word >> 16) & 0xFFFF) as u16;
// //取出低字部分
// let low_word1 = (low_word & 0xFFFF)as u16;
// //高字部分交换高低字节
// let high_word1=((high_word1>>8)|(high_word1<<8)) as u32;
// //低字部分交换高低字节
// let low_word1=((low_word1>>8)|(low_word1<<8)) as u32;
// //高字部分和低字部分合并
// let result_low=((low_word1 << 16) | high_word1) as u64;
//高字部分交换高低字节
//高字部分和低字部分合并
// (result_low << 32) | result_high
}
#[cfg(test)]
mod test{
use super::*;
#[test]
pub fn test_swap_u16_bytes(){
let data:u16=0b11000011_00110011;
assert_eq!(0b00110011_11000011,swap_u16_bytes(data));
let data:u16=0b10101010_01010101;
assert_eq!(0b01010101_10101010,swap_u16_bytes(data));
}
#[test]
pub fn test_swap_u32_bytes(){
let data:u32=0b11001100_00110011_11001100_00110011;
assert_eq!(0b00110011_11001100_00110011_11001100,swap_u32_bytes(data));
}
#[test]
pub fn test_swap_u64_bytes(){
let data:u64=0b11001100_00110011_11001100_00110011_11001100_00110011_11001100_00110011;
assert_eq!(0b00110011_11001100_00110011_11001100_00110011_11001100_00110011_11001100,swap_u64_bytes(data));
let data:u64=0b11001101_00110010_11001100_00110011_11001100_00110011_11001100_00110011;
assert_eq!(0b00110010_11001101_00110011_11001100_00110011_11001100_00110011_11001100,swap_u64_bytes(data));
}
}