字符串如何解析成对象? 10C

问题如下:
有如下字符串“01100101011001100101010101000110001110101110001100”
我要把这一个解析成一个User对象,解析规则如下,
前6位是id,
往后4位是username,
6位是password,
4位是sex,就像这样,
我该怎么解析呢?怎么解析比较好?

8个回答

String str = "01100101011001100101010101000110001110101110001100";

User.setId(str.substr(0, 6));
User.setUserName(str.substr(6, 10));
User.setPassword(str.substr(10, 16));
User.setSex(str.substr(16, 20));

u013935114
永无止境I 我也考虑过这样写,不过这样写太麻烦 ,有大约27个对象,每个对象属性都不一样,有的只有几个,多的有二十几个,有没有什么别的办法?
2 年多之前 回复

1、你可以先 判断一下字符串长度是否正确。使用协议传输数据,首先要判断接收的数据是否正确,再进行转换
2、你的转换规则是怎样的?是否是字符串转二进制 再转十进制,如果是,建议先转成一个十六进制的32位的数;去掉多余的位,然后按照你的解析协议拆分字符串,然后再分别解析;

ly961553686
千葉Toufu 回复u013935114: 整体解析就是每个属性的解析方式 比如: fun(属性编号,属性长度,截取的字符串) { case编号1: 对属性1的字符串进行解析,返回结果; case编号2: 对属性2的字符串进行解析,返回结果; case编号3: 对属性3的字符串进行解析,返回结果; ...... }
2 年多之前 回复
ly961553686
千葉Toufu 回复u013935114: 你user的每个属性总有一个先后顺序吧 这个应该是固定的吧,取了ID后按照你得到的属性的长度,按顺序截取字符串就行了。比如有个用户P,p下面有四个属性1、2、3、4,长度分别为L1、L2、L3、L4;这四个属性的先后顺序为2、3、1、4;那截取字符串的先后顺序与长度不就清楚了吗,就从ID之后取L2个长度的字符作为属性2的解析原始码,L3个长度的字符作为属性3的解析原始码,这样以此类推
2 年多之前 回复
u013935114
永无止境I 回复ly961553686: 不明白你说的怎么才能写代码实现,你说的是定义属性的值 表示位数吗,比如String sex=4,String name=5,后边的数字表示位数吗?这个整体解析函数怎么写?通过传编号属性,得到属性长度解析 出属性,比如我传递一个属性为name值为5这样的一个字段,该从哪截取呢?
2 年多之前 回复
ly961553686
千葉Toufu 回复u013935114: 不固定就可以用我上一条回复你的方法
2 年多之前 回复
u013935114
永无止境I 回复ly961553686: 长度不固定,比如说这个对象有5个属性,但只解析到前3个属性,数据已经解析到末尾了,这时候只能结束解析了
2 年多之前 回复
ly961553686
千葉Toufu 回复u013935114: 比如一串二进制代码 01100101011010100101 先取出表示ID的前6位。得到ID后,根据ID判断这个ID有几个属性。 判断的前提是 1、每个ID的属性和属性个数是固定的,并且你知道,给出一个函数:可以让你通过ID知道这个ID有哪些属性(就是得到属性和属性个数); 2、要预先给每个属性做一个定义,定义包括两个方面:1、给属性编号;2、属性用二进制表示时的位数(就是有多少位二进制,比如sex属性由4位 二进制表示,那么就定义为4位)。 最后得到 ID号 各个属性编号A、B、C、D 和属性对应的二进制长度A_length B_length C_length D_length,按照各个二进制长度进行拆分 3、再定义一个整体解析函数,包括所有的属性解析方法(比如你有27个属性,那就有27个解析方法)。通过传递属性编号A、对应的编号长度 A_length 和 对应的二进制 可以解析出USER的第一个属性 以此解析出第二个 第三个。 而整体解析函数只需要定义一次,所有的user都可以调用
2 年多之前 回复
ly961553686
千葉Toufu 回复u013935114: 你的意思是对象的字符串长度是固定的,只是有的属性段是全零吗?
2 年多之前 回复
u013935114
永无止境I 回复ly961553686: 没明白你什么意思,属性个数和属性是固定不变的,但有可能某个字段为空,也有可能某个不一样,这些先不考虑吧。暂且先属性个数和属性是固定不变的,那我该怎么解析呢,像这样User.setUserName(str.substr(6, 10)); 截取字符串来解析?还有没有好的办法?
2 年多之前 回复
ly961553686
千葉Toufu 每个对象对应的属性个数和属性是固定不变的吧?如果是那你可以定义一个解析函数 fun(ID),通过ID判断得到对应的属性个数(给每个属性做一个编号),通过编号判断是哪个属性,就可以知道每个属性的二进制数长度,然后结合属性个数,就可以正确分段。最后进行解析
2 年多之前 回复
ly961553686
千葉Toufu 每个对象对应的属性个数和属性是固定不变的吧?如果是那你可以定义一个解析函数 fun(ID),通过ID判断得到
2 年多之前 回复
u013935114
永无止境I 现在的问题是我怎么把这个二进制数解析成一个对象,大约有27个对象,里边每个属性都不一样,前6位转换成10进制,表示id,然后确定是哪个对象,每个对象的属性都不一样
2 年多之前 回复
u013935114
永无止境I 解析规则:比如一个字符串,对单个字符加上一个16进制的数,转换二进制,然后去掉最高两位,对每位字符都要进行这样的操作,然后再分几位解析,
2 年多之前 回复

构建一个user类,当然类里面需要包含你说的这些字段,
然后用java里面的字符串截取函数substring(),如str.substring(2,4)就是截取第2到第4个字符,返回值赋值给相应的字段就可以了

u013935114
永无止境I 这样做太麻烦, 一是属性太多,二是对象也太多
2 年多之前 回复

Java的话给User类一个字符串参数的构造方法,在方法里想怎么解析就怎么解析。

如果字符串规则明确,考虑正则

u013935114
永无止境I 你的意思是把这个字符串传到构造方法里?在这里边解析?
2 年多之前 回复

这么传输数据只能每个截取解析吧

传输这种数据使用json吧 对象转换方便

a718089112
a718089112 回复u013935114: 第一句说了啊,只能每个字符串截取,没有别的方法,因为你们数据交互的规则就是字符串。我后面只是建议一个更合理的不同系统之间数据传输的方案
2 年多之前 回复
u013935114
永无止境I 我接收到的就是一大串字符串,然后从中解析出想要的数据,你这一点和需求相差太大
2 年多之前 回复

构建一个类咯

public class myuser{
private String inputStr;
private int id;
private String userName

 public int getInputStr(){
            return inputStr;
 }

 pulic void setInputStr(String userName){
        this.inputStr = inputStr;
 }

 public String getUserName(){
        return =  this.inputStr.substr(6, 10);
 }

 public void setUserName(String userName){
    this.userName = userName
 }

}

以此类推。只有赋值inputStr,就可以get出其他字段。

u013935114
永无止境I 我也想这样做,可不知道怎么写才好?
2 年多之前 回复
u013935114
永无止境I 不知道怎么赋值才更方便,更快捷,看看你们有没有什么好的办法?
2 年多之前 回复

1、把要映射的字段和对应的字符串角标都初始化到map中
2、遍历map,通过反射把每次截取的字符串执行set"FieldName"

这问题你还问人,都是直接截取。
放一个String类型字符串,直接在对象中截取
getNme(String str){
return str.substring(开始,结束)
先判断 str的长度
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐