最新说明:自7月份始,文章公布后,Cradio官方更新了加密算法,故以下实现只对7月份之前的版本有效.关于最新的电台数据,目前只能通过js的方式获取,而相关的除电台名称,地址之外信息还需另外搜集和整理.在此,请诸位自行决定.(再次声明:js获取数据方式因可能对Cradio官方服务器产生不良影响,在此不再公布.)
以下是解密算法的java实现,已通过验证:
public class Test {
public static void main(String[] args) {
RadioParser parser = new RadioParser("f:/data.idp", "f:/data.dat");
for(RadioSegement segement : parser) {
System.out.println(segement.getRadioInfo());
System.out.println("\n\n");
}
}
}
public class RadioSegement {
private int startAddr;
private int endAddr;
private String info;
private RadioInfo radioInfo;
public RadioSegement(int startAddr, int endAddr) {
this.startAddr = startAddr;
this.endAddr = endAddr;
}
public int getStartAddr() {
return startAddr;
}
public int getEndAddr() {
return endAddr;
}
public int length() {
return endAddr - startAddr;
}
void setInfo(String info) {
this.info = info;
}
public String getInfo() {
return info;
}
public RadioInfo getRadioInfo() {
if(radioInfo == null) {
radioInfo = new RadioInfo(this);
}
return radioInfo;
}
public String toString() {
return "startAddr: " + startAddr + ", endAddr: " + endAddr + ", info: " + info;
}
}
public class RadioInfo {
private String[] data;
private static int index = 0;
private final static int INDEX_NAME = index++;
private final static int INDEX_TYPE = index++;
private final static int INDEX_COUNTRY = index++;
private final static int INDEX_PROVINCE = index++;
private final static int INDEX_CITY = index++;
private final static int INDEX_LANGUAGE = index++;
private final static int INDEX_FORMAT = index++;
private final static int INDEX_VALIDITY = index++;
private final static int INDEX_SPEED = index++;
private final static int INDEX_FREQUENCY = index++;
static {
index++;
}
private final static int INDEX_HOME_URL = index++;
private final static int INDEX_PROGRAMME_URL = index++;
private final static int INDEX_BROADCAST_URL = index++;
RadioInfo(RadioSegement segement) {
data = segement.getInfo().split("\t", -1);
if(data.length != 14) {
return;
}
}
public String getName() {
return data[INDEX_NAME];
}
public String getType() {
return data[INDEX_TYPE];
}
public String getCountry() {
return data[INDEX_COUNTRY];
}
public String getProvince() {
return data[INDEX_PROVINCE];
}
public String getCity() {
return data[INDEX_CITY];
}
public String getLanguage() {
return data[INDEX_LANGUAGE];
}
public String getFormat() {
return data[INDEX_FORMAT];
}
public String getValidity() {
return data[INDEX_VALIDITY];
}
public String getSpeed() {
return data[INDEX_SPEED];
}
public String getFrequency() {
return data[INDEX_FREQUENCY];
}
public String getHomeUrl() {
return data[INDEX_HOME_URL];
}
public String getProgrammeUrl() {
return data[INDEX_PROGRAMME_URL];
}
public String getBroadcastUrl() {
return data[INDEX_BROADCAST_URL];
}
public String toString() {
return new StringBuilder()
.append("\n名称: ").append(getName())
.append