嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2015-12-12 3112 次浏览 标签 : JavaCYar

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

接着前面学习实现 Yar Java 客户端的笔记 http://mengkang.net/586.html

还是从实际运用中体会更加深刻,再 Yar 中定义了_yar_header结构体

typedef struct _yar_header {
     unsigned int   id;
     unsigned short version;
     unsigned int   magic_num;
     unsigned int   reserved;
     unsigned char  provider[32];
     unsigned char  token[32];
     unsigned int   body_len;
}

这里char占的1字节,但是在 java 里面char占2个字节。

char在Java中是16位的,因为Java用的是Unicode。不过8位的ASCII码包含在Unicode中,是从0~127的。

Java中使用Unicode的原因是,Java的Applet允许全世界范围内运行,那它就需要一种可以表述人类所有语言的字符编码。Unicode。但是English,Spanish,German, French根本不需要这么表示,所以它们其实采用ASCII码会更高效。这中间就存在一个权衡问题。


因为char是16位的,采取的Unicode的编码方式,所以char就有以下的初始化方式:

char c= 'c'; //字符,可以是汉字,因为是Unicode编码
char c= 十进制数,八进制数,十六进制数等等; //可以用整数赋值
char c= '\u数字'; //用字符的编码值来初始化,如:char='\0',表示结束符,它的ascll码是0,这句话的意思和 char c=0 是一个意思。


鸟哥在设计_yar_header中的providertoken的时候实际意义就是说 ASCII 码在0~127之间的,也就是我们常用的用户名密码一样,英文加各种字符。具体可以查看 ASCII 码表。那么我在 Java 中表示的时候,如果用char[16]则密码强度跟不上,为了保持密码强度,这里我用 String 来代替。

public class YarHeader {

    private int id;
    private short version;
    private int magicNum;
    private int reserved;
    private String provider;
    private String token;
    private int bodyLen;

    //...
}


嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表