Skip to content

Instantly share code, notes, and snippets.

@b1tg
Created September 13, 2022 15:22
Show Gist options
  • Save b1tg/ab285404c381d2d3dbea4153213b231a to your computer and use it in GitHub Desktop.
Save b1tg/ab285404c381d2d3dbea4153213b231a to your computer and use it in GitHub Desktop.
NETBIOS 主机名编码算法 (rust)
// https://cloud.tencent.com/developer/article/1116151
// https://stackoverflow.com/questions/13652319/decode-netbios-name-python
// When correctly reversed, Netbios_Name should output in ASCII : "TESDTDDSSS"
const NetbiosName: &str = "\x46\x45\x45\x46\x46\x44\x45\x45\x46\x45\x45\x45\x45\x45\x46\x44\x46\x44\x46\x44\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41";
fn netbios_encode(input: &str) -> Vec<u8> {
let mut res: Vec<u8> = vec![];
for c in input.bytes() {
res.push(c/0x10+0x41);
res.push(c%0x10+0x41);
}
let res_len = res.len();
dbg!(res_len);
if res_len < 32 {
for _ in 0..(32-res_len)/2 {
res.extend_from_slice(&[0x43,0x41])
}
}
res
}
fn netbios_decode(input: &[u8]) -> Result<String, ()>{
let mut name:Vec<u8> = vec![];
let mut tmp = 0;
for (i, c) in input.iter().enumerate() {
let c1 = c-0x41;
if i%2 == 0 {
tmp = c1*0x10;
} else {
tmp += c1;
name.push(tmp);
}
}
Ok(String::from_utf8(name).unwrap())
}
fn main() {
println!("Hello, world!");
dbg!(netbios_decode(&NetbiosName.as_bytes()));
}
#[test]
fn test_netbios() {
dbg!(NetbiosName.len());
assert_eq!(netbios_decode(&NetbiosName.as_bytes()).unwrap().trim(), "TESDTDDSSS");
assert_eq!(netbios_encode("TESDTDDSSS"), NetbiosName.bytes().collect::<Vec<u8>>());
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment