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