first commit
This commit is contained in:
commit
d52e770aff
1509
Cargo.lock
generated
Normal file
1509
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
7
Cargo.toml
Normal file
7
Cargo.toml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[package]
|
||||||
|
name = "transfem_communication"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
actix-web = "4.9.0"
|
||||||
BIN
src/.main.rs.swp
Normal file
BIN
src/.main.rs.swp
Normal file
Binary file not shown.
76
src/lib.rs
Normal file
76
src/lib.rs
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
const CHARSET: [&str; 8] = ["EEE", "eee", "EeE", "eEe", "EEe", "eEE", "Eee", "eeE"];
|
||||||
|
|
||||||
|
pub fn encode(bytes: Vec<u8>) -> String {
|
||||||
|
let mut result = String::new();
|
||||||
|
|
||||||
|
let mut buffer: u16 = 0;
|
||||||
|
let mut buffer_size = 0;
|
||||||
|
|
||||||
|
for byte in bytes {
|
||||||
|
buffer = (buffer << 8) | byte as u16;
|
||||||
|
buffer_size += 8;
|
||||||
|
|
||||||
|
while buffer_size >= 3 {
|
||||||
|
buffer_size -= 3;
|
||||||
|
let index = ((buffer >> buffer_size) & 0b111) as usize;
|
||||||
|
buffer &= (1 << buffer_size) - 1;
|
||||||
|
|
||||||
|
result.push_str(CHARSET[index]);
|
||||||
|
result.push(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if buffer_size > 0 {
|
||||||
|
let index = (buffer << (3 - buffer_size)) as usize;
|
||||||
|
result.push_str(CHARSET[index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn encode_str(message: &str) -> String {
|
||||||
|
return encode(message.as_bytes().to_vec());
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn decode(message: &str) -> Vec<u8> {
|
||||||
|
let mut result = Vec::new();
|
||||||
|
|
||||||
|
let map: HashMap<_, _> = CHARSET.iter().enumerate().map(|(i, &s)| (s, i)).collect();
|
||||||
|
|
||||||
|
let characters = message.split(' ');
|
||||||
|
|
||||||
|
let mut buffer: u16 = 0;
|
||||||
|
let mut buffer_size = 0;
|
||||||
|
|
||||||
|
for char in characters {
|
||||||
|
if char.is_empty() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let value = *map.get(char).expect("Invalid character in input");
|
||||||
|
buffer = (buffer << 3) | value as u16;
|
||||||
|
buffer_size += 3;
|
||||||
|
|
||||||
|
while buffer_size >= 8 {
|
||||||
|
buffer_size -= 8;
|
||||||
|
let byte = ((buffer >> buffer_size) & 0xFF) as u8;
|
||||||
|
buffer &= (1 << buffer_size) - 1;
|
||||||
|
|
||||||
|
result.push(byte);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if buffer_size == 3 {
|
||||||
|
let byte = buffer as u8;
|
||||||
|
result.push(byte);
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn decode_str(message: &str) -> String {
|
||||||
|
String::from_utf8(decode(message)).expect("Decoded bytes were not valid UTF-8")
|
||||||
|
}
|
||||||
28
src/main.rs
Normal file
28
src/main.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
use std::sync::Mutex;
|
||||||
|
use transfem_communication::encode_str;
|
||||||
|
use transfem_communication::decode_str;
|
||||||
|
use actix_web::{get, post, web, App, HttpServer, Responder, HttpResponse};
|
||||||
|
#[get("/e/{message}")]
|
||||||
|
async fn encode_message(path: web::Path<String>) -> impl Responder {
|
||||||
|
let message = path.into_inner();
|
||||||
|
HttpResponse::Ok().body(encode_str(&message))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[get("/d/{message}")]
|
||||||
|
async fn decode_message(path: web::Path<String>) -> impl Responder {
|
||||||
|
let message = path.into_inner();
|
||||||
|
HttpResponse::Ok().body(decode_str(&message))
|
||||||
|
}
|
||||||
|
#[actix_web::main]
|
||||||
|
async fn main() -> std::io::Result<()> {
|
||||||
|
println!("started");
|
||||||
|
HttpServer::new(|| {
|
||||||
|
App::new()
|
||||||
|
.service(decode_message)
|
||||||
|
.service(encode_message)
|
||||||
|
})
|
||||||
|
.bind("0.0.0.0:26454")?
|
||||||
|
.run()
|
||||||
|
.await
|
||||||
|
}
|
||||||
27
src/main.rs~
Normal file
27
src/main.rs~
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
use std::sync::Mutex;
|
||||||
|
use transfem_communication::encode_str;
|
||||||
|
use transfem_communication::decode_str;
|
||||||
|
use actix_web::{get, post, web, App, HttpServer, Responder, HttpResponse};
|
||||||
|
#[get("/E/e/{message}")]
|
||||||
|
async fn encode_message(path: web::Path<String>) -> impl Responder {
|
||||||
|
let message = path.into_inner();
|
||||||
|
HttpResponse::Ok().body(encode_str(&message))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[get("/E/d/{message}")]
|
||||||
|
async fn decode_message(path: web::Path<String>) -> impl Responder {
|
||||||
|
let message = path.into_inner();
|
||||||
|
HttpResponse::Ok().body(decode_str(&message))
|
||||||
|
}
|
||||||
|
#[actix_web::main]
|
||||||
|
async fn main() -> std::io::Result<()> {
|
||||||
|
HttpServer::new(|| {
|
||||||
|
App::new()
|
||||||
|
.service(decode_message)
|
||||||
|
.service(encode_message)
|
||||||
|
})
|
||||||
|
.bind("0.0.0.0:26454")?
|
||||||
|
.run()
|
||||||
|
.await
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user