如此需求该如何设计实体类?

sccscc321 2014-07-24 02:51:34
各位大神好!
刚刚遇到这样一个需求:
客户端socket向服务端socket发送的数据格式如下:
Application header, Version,...(后面还有其他的,不一一列举了)

然后Application header的格式如下:

意思就是Application header的长度为4个byte,第一个byte的第0位存储的是ACP protocol,依此类推。还有一些表格定义了各项的取值范围,例如ACP protocol的取值为0或1,Message Type的取值范围为0到31。

Version也有格式的相关规定,和Application header类似。

那么我的问题是,如何设计实体类才能灵活地根据各属性得到所需要的格式的数据?
Application header这个实体得到的是“010111110101101...”这样的字符串吗?
那客户端socket向服务端socket发送的数据是Application header和Version的二进制字符串拼接起来的字符串吗?

由于客户就只给了这些书面资料,并没有作过多说明,所以,拜托各位出出主意,谢谢了!

我不知道该如何设计实体类,以下只是一个大概
public class ApplicationHeader {
private byte ACPProtocol;
private byte privateFlag;
private byte testFlag;
private byte messageType;
private byte versionFlag;
private byte version;
private byte messageControlFlag;
private int messageLength;

public ApplicationHeader() {

}

public String getApplicationHeader(){
return "";
}
}
...全文
281 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sccscc321 2014-07-31
  • 打赏
  • 举报
回复
引用 7 楼 losebaby 的回复:
假设读取和写入的都是字节数组,我就拿前第一个字节的四个属性为例写下读取和写入的代码段,后面的楼主自己琢磨下,应该没啥难度。

public class ApplicationHeader {
    private int  _apc_protocol;	
    private int  _private_Flag;	
    private int  _test_Flag;	
    private int  _message_Type;	

    public void read(byte[] bytes){
            _apc_protocol = bytes[0] & 1;
            _private_Flag = (bytes[0] & 2) >> 1;
            _test_Flag = (bytes[0] & 4) >> 2;
            _message_Type = bytes[0] >> 3;
    }

    public byte[] write(){
        byte[] bytes = new byte[4];
        int tmp = (_apc_protocol & 1) | ((_private_Flag & 1) << 1) | ((_test_Flag & 1) << 2) | _message_Type << 3;
        bytes[0] = (byte)tmp;
        
        return bytes;
    }
}
什么封装属性字段的get set的方法,我就懒得贴了,累
确实是我想要的,谢谢! 用byte[]更方便 分都给你
可乐罐 2014-07-28
  • 打赏
  • 举报
回复
假设读取和写入的都是字节数组,我就拿前第一个字节的四个属性为例写下读取和写入的代码段,后面的楼主自己琢磨下,应该没啥难度。

public class ApplicationHeader {
    private int  _apc_protocol;	
    private int  _private_Flag;	
    private int  _test_Flag;	
    private int  _message_Type;	

    public void read(byte[] bytes){
            _apc_protocol = bytes[0] & 1;
            _private_Flag = (bytes[0] & 2) >> 1;
            _test_Flag = (bytes[0] & 4) >> 2;
            _message_Type = bytes[0] >> 3;
    }

    public byte[] write(){
        byte[] bytes = new byte[4];
        int tmp = (_apc_protocol & 1) | ((_private_Flag & 1) << 1) | ((_test_Flag & 1) << 2) | _message_Type << 3;
        bytes[0] = (byte)tmp;
        
        return bytes;
    }
}
什么封装属性字段的get set的方法,我就懒得贴了,累
sccscc321 2014-07-25
  • 打赏
  • 举报
回复
有没有人能给个具体的指导啊
zy_think123 2014-07-24
  • 打赏
  • 举报
回复
看你需要,你需要什么就怎么设计呗,但是不要冗余
hedley 2014-07-24
  • 打赏
  • 举报
回复
你这设计不挺好么满足需求 相信需要的信息就写方法解析呗
sccscc321 2014-07-24
  • 打赏
  • 举报
回复
谢谢楼上1楼和2楼的回复。 我还想表达的是,怎么设计实体类和各种方法,能做到给某个属性设置值之后,就可以得到一个Application header,示例如下: ACP protocol设置为1 Private Flag设置为0 Test Flag设置为0 Message Type设置为31(二进制即11111) Version Flag设置为0 Version设置为0 Message Control Flag设置为1010 Message Length设置为132(二进制即10000100) 由于表格中的第0位到第7位是从左到右,我们都知道应该是从右到左, 那么,倒过来就是 第一个byte是:11111001 第二个byte是:01010000 第三个byte是:10000100 第四个byte是:00000000 最后得到的Application header就是四个byte合起来 11111001 01010000 10000100 00000000 要达到的是这样的效果,并且随便拿到一个Application header也能解析出其各属性的值。
wangqiao4j 2014-07-24
  • 打赏
  • 举报
回复
可以使用复合主键的思想试试。至于长度的判断接收值的时候可以判断。
dw_java08 2014-07-24
  • 打赏
  • 举报
回复
从面相对象的思想进行设计,从数据对象的角度进行考虑设计

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧