计算机网络局域异步通信RSC编码模拟

#记录计算机网络学习过程

简述实验内容

编写程序,以字节大端序,位小端序,输入字符串,将每个字母以7-bit方式编码,每个字节前有STARTBYTE,每个字节后还有STOPBYTE。

RS232规定的电压区间在-15V到+15V之间,负电压表示逻辑1,正电压表示逻辑0,这里采取-15V表示1,+15V表示0。

接口:

vector<double> re232c_encode(vector<char>& msg) //将字符串msg编码成电压序列
vector<char> re232c_decode(vector<double>& volts)//将电压解码成字符串

以下是接口的c++实现

vector<double> re232c_encode(vector<char>& msg) {
	vector<double> volts;
	for (int i = 0; i < msg.size(); i++) {
		char c = msg[i];//字节大端序
		volts.push_back(15);//起始位
		for (int j = 0; j < 7; j++) {//位小端序
			if ((c >> j) & 1) {
				volts.push_back(-15);
			}
			else {
				volts.push_back(15);
			}
		}
		volts.push_back(-15);
	}
	return volts;
}

vector<char> re232c_decode(vector<double>& volts) {
	vector<char> msg;
	for (int i = 0; i < volts.size(); i++) {
		if (volts[i] < 0) {//寻找起始位
			continue;
		}
		char c = 0;
		for (int j = 0; j < 7; j++) {
			if (volts[i + j + 1] < 0) {
				c |= 1 << j;
			}
		}
		msg.push_back(c);
		i += 7;
	}
	return msg;
}

测试

main函数如下

int main() {

	vector<char> msg;
	int size;
	cout << "Enter the size of the message: ";
	cin >> size;
	cout << "Enter the message: ";
	for (int i = 0; i < size; i++) {
		char c;
		cin >> c;
		msg.push_back(c);
	}
	vector<double> volts = re232c_encode(msg);
	for (int i = 0; i < volts.size(); i++) {
		cout << volts[i] << " ";
	}
	cout << endl;
	cout << "Decoded message: ";
	vector<char> decoded = re232c_decode(volts);
	for (int i = 0; i < decoded.size(); i++) {
		cout << decoded[i] << " ";
	}
	cout << endl;
	return 0;
}

执行结果演示

存在的问题

  1. 需要每次都手动输入传输的字符串大小
  2. 不能读取空格

于是我们使用java写了一版

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//计网局域异步通信作业
public class NetCode {
    public static void main(String[] args) {
        int size;
        System.out.println("输入要传输的字符串");
        Scanner in = new Scanner(System.in);
        String msg= in.nextLine();
        List<Double> volts= rs232c_encode(msg);
        System.out.println(volts);
        System.out.println("解码后的信息如下");
        String res =rs232c_decode(volts);
        System.out.println(res);
    }

    public static List<Double> rs232c_encode(String msg){
        List<Double> volts= new ArrayList<>();
        for(int i=0;i<msg.length();i++){
            volts.add(15.0);
            char c=msg.charAt(i);
            for(int j=0;j<7;j++){
               if(((c>>j)&1)==1){
                   volts.add(-15.0);
               }
               else volts.add(15.0);
            }
            volts.add(-15.0);
        }
        return volts;
    }

    public static String rs232c_decode(List<Double> volts){
        String msg= new String();
        for(int i=0;i<volts.size();i++){
            if(volts.get(i)<0) continue;
            char c=0;
            for(int j=0;j<7;j++){
                if(volts.get(i+j+1)<0) c|= (char) (1<<j);
            }
            msg+=c;
            i+=7;
        }
        return msg;
    }
}

运行结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值