/// <summary> /// 对6-bit CAGE/DODAAC进行编码 /// </summary> /// <param name="segment">URI中的逻辑段</param> /// <returns>成功返回存放编码结果的字节数组,否则返回null</returns> private byte[] EncodeCAGEorDoDAAC(string segment) { //计算6-bit可变串长度 BitArr bitArr = new BitArr(36); if (segment.Length == 5) { bitArr.Append(32, 6); } else if (segment.Length == 6) { } else { return(null); } for (int i = 0; i < segment.Length; i++) { byte hv = Symbols.GetSet39HexValue(segment[i]); if (hv != 0) { bitArr.Append(hv, 6); } else { //此字符并不在Set39中,编码失败 return(null); } } return(bitArr.ToByteArray()); }
/// <summary> /// 对6-bit可变串进行编码 /// </summary> /// <param name="segment">URI中的逻辑段</param> /// <returns>成功返回存放编码结果的字节数组,否则返回null</returns> private byte[] EncodeSet39(string segment) { //计算6-bit可变串长度 int i = 0; int len = Symbols.CalcActualLength(segment) * 6 + 6; //每字符占用6-bit,加上长度为6-bit的数字0 BitArr bitArr = new BitArr(len); while (i < segment.Length) { if (segment[i] != '%') { byte hv = Symbols.GetSet39HexValue(segment[i]); if (hv != 0) { bitArr.Append(hv, 6); i++; } else { //此字符并不在Set39中,编码失败 return(null); } } else //转义三元组的情况 { if (i < segment.Length - 2) { string triplet = segment.Substring(i, 3); byte hv = Symbols.GetSet39HexValue(triplet); if (hv != 0) { bitArr.Append(hv, 6); i += 3; } else { //此字符并不在Set39中,编码失败 return(null); } } else //%后面不足两个字符,凑不齐转义三元组,语法错误 { return(null); } } } bitArr.Append(0, 6); return(bitArr.ToByteArray()); }
/// <summary> /// 对字符串进行编码 /// </summary> /// <param name="segment">URI中的逻辑段</param> /// <param name="bitLen">编码长度</param> /// <returns>成功返回存放编码结果的字节数组,否则返回null</returns> private static byte[] EncodeSet82(string segment, int bitLen) { int i = 0; BitArr bitArr = new BitArr(bitLen); while (i < segment.Length) { if (segment[i] != '%') { byte hv = Symbols.GetSet82HexValue(segment[i]); if (hv != 0) { bitArr.Append(hv, 7); i++; } else { //此字符并不在Set82中,编码失败 return(null); } } else //转义三元组的情况 { if (i < segment.Length - 2) { string triplet = segment.Substring(i, 3); byte hv = Symbols.GetSet82HexValue(triplet); if (hv != 0) { bitArr.Append(hv, 7); i += 3; } else { //此字符并不在Set82中,编码失败 return(null); } } else //%后面不足两个字符,凑不齐转义三元组,语法错误 { return(null); } } } return(bitArr.ToByteArray()); }