| 
									
										
										
										
											2014-10-31 14:45:03 +01:00
										 |  |  | package trie | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"encoding/hex" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | func CompactEncode(hexSlice []byte) string { | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	terminator := 0 | 
					
						
							|  |  |  | 	if hexSlice[len(hexSlice)-1] == 16 { | 
					
						
							|  |  |  | 		terminator = 1 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if terminator == 1 { | 
					
						
							|  |  |  | 		hexSlice = hexSlice[:len(hexSlice)-1] | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	oddlen := len(hexSlice) % 2 | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 	flags := byte(2*terminator + oddlen) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	if oddlen != 0 { | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 		hexSlice = append([]byte{flags}, hexSlice...) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 		hexSlice = append([]byte{flags, 0}, hexSlice...) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var buff bytes.Buffer | 
					
						
							|  |  |  | 	for i := 0; i < len(hexSlice); i += 2 { | 
					
						
							|  |  |  | 		buff.WriteByte(byte(16*hexSlice[i] + hexSlice[i+1])) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return buff.String() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | func CompactDecode(str string) []byte { | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	base := CompactHexDecode(str) | 
					
						
							|  |  |  | 	base = base[:len(base)-1] | 
					
						
							| 
									
										
										
										
											2014-02-18 01:34:06 +01:00
										 |  |  | 	if base[0] >= 2 { | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 		base = append(base, 16) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if base[0]%2 == 1 { | 
					
						
							|  |  |  | 		base = base[1:] | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		base = base[2:] | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return base | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | func CompactHexDecode(str string) []byte { | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	base := "0123456789abcdef" | 
					
						
							| 
									
										
										
										
											2015-01-29 23:17:43 +01:00
										 |  |  | 	var hexSlice []byte | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	enc := hex.EncodeToString([]byte(str)) | 
					
						
							|  |  |  | 	for _, v := range enc { | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 		hexSlice = append(hexSlice, byte(strings.IndexByte(base, byte(v)))) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	hexSlice = append(hexSlice, 16) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return hexSlice | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-27 01:08:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | func DecodeCompact(key []byte) string { | 
					
						
							| 
									
										
										
										
											2015-01-29 23:17:43 +01:00
										 |  |  | 	const base = "0123456789abcdef" | 
					
						
							| 
									
										
										
										
											2014-05-27 01:08:51 +02:00
										 |  |  | 	var str string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, v := range key { | 
					
						
							|  |  |  | 		if v < 16 { | 
					
						
							|  |  |  | 			str += string(base[v]) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-29 23:18:46 +01:00
										 |  |  | 	res, _ := hex.DecodeString(str) | 
					
						
							| 
									
										
										
										
											2014-05-27 01:08:51 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return string(res) | 
					
						
							|  |  |  | } |