#记录计算机网络学习过程
简述实验内容
编写程序,以字节大端序,位小端序,输入字符串,将每个字母以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;
}
执行结果演示
存在的问题
- 需要每次都手动输入传输的字符串大小
- 不能读取空格
于是我们使用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;
}
}