using System.Collections.Generic;
using System.Globalization;
string encodedString = "oe{lJswd_Ax@@HBHH??SdA??M\\MPi@NUG{@w@??E^Bd@??Rz@@\\??MPc@LBn@??DX??k@`@_@b@e@t@??cBjD??]h@??W`@??}ChB??a@Z??k@f@??eA`A??EY??Io@GmACoE?kA???jABnEFlAHn@??DX??dAaA??j@g@??`@[??|CiB??Va@??\\i@??bBkD??d@u@^c@j@a@??^K|B[~Aq@??l@Kr@Dp@`@VZR^??n@xA~@rC??h@`BNl@LdABvA??CjAKt@Ox@??}@zD??I^??G^??Y~B??IBEJCN??@PDNFDHCDK??x@t@??n@V??\\R??h@f@??PR??DD??p@pALZ??Tr@Rx@PhA??LdA??LhBJl@Pb@??b@^??@H@DBBB?DA??@C@C@I???IAGCECAC???A[A]?_@@g@??Bm@Bc@??F}@PsB??RwC??VwD??Dw@@m@???u@Cq@??Ea@G]K]M[??Uc@MWKWKYG[G]Ec@A[Ae@@_@B_@D_@F]La@Pe@??Xi@bDeG^q@Te@Xm@Rk@Ro@Ru@ZoAlAeFR}@Nq@P_ALw@Jw@Fs@D{@??@o@@cA?_B???y@??@o@@[??@]Dw@??VyD??F}@Bg@??@OBs@@i@???u@?aA??AwA?}@BaADy@??Hi@Lo@Li@hB_H??fBuG??ZiAJc@??Lk@Ny@Hm@Dc@??Bc@Bi@??@_@@k@??AeAC{@Co@Ew@Cm@Cq@Aq@?k@Bs@Do@Dg@Fi@Jw@NcAPmA`@mC??f@_DPcANw@Py@Ps@V{@Xy@hAwC??h@uAVu@Po@Lo@Jq@LgAJkAToCFo@J}@N}@Lq@Rw@Vy@Tu@b@uA??b@sARm@Ng@Je@Fc@De@Bm@?k@Ag@Eq@Gy@G{@IiAEw@As@?s@??@i@Bg@Dg@Hk@Lm@Lc@N_@R]RWRSXSPOPYNe@??Ha@D[Da@HcAD_@DYFYH[HSJQNURS??pBaB??\\[??ZW??TQPKPIPG??lAYXI??PKPKLOLS??HUL_@J]Nk@??H[HW??L_@??Vg@V_@??X[`@[XU\\U^Sf@W^OTOVUPYJYH]Fa@B]@a@?c@Ca@E[Ia@M]MUOU??OQSQSO[UYS??US??OO??OOY]??Y_@a@g@k@{@[c@??y@sA[g@Yi@??[cA??CKOg@Kq@??EU??E[SsBAOCm@??AUAi@??AgA?S???a@@q@@o@By@Bo@??Dw@F_AF{@H{@Hm@Jq@Jg@Ja@??Ng@Pe@N[NWNSNOPOLITKTG??LGNKJMJUHYFa@B[??Bg@Bs@??DADE@E@I??hAD??l@@??X@\\M`A_@??|@[fDcA??`@K??h@MREPGJG??TQJK??JOXi@??Te@pAiC??dC{Eb@{@??Ti@N]Pg@Pe@Tu@Ty@??T{@??n@eC??J_@??|@iD??Pq@L_@P_@PWTY??RKPGXC\\@RBTB??`@H??`@B??XEPERMPSPWP]LYN_@??FQ??BGJU??L[NWNQLK??PI??PC??N???D?TB??@JBHDD??D@DABCBG??@E@MAQCIEGEA???w@?K???m@@u@??@_@Be@Da@F_@??H]J_@??Pm@??l@mBTs@??Vw@??Ni@Ru@TgALs@??Jw@JgAJuAJ}AHuA??J{ADo@??Bq@@y@?]??BE@I?I??AICGCAC?C@??M_@Qo@Qq@Ss@??@I?MAGCE??B]Fi@Ju@Lq@Py@Rs@Ne@??Ng@Ja@??DMPk@??BDD@DCBC??BG@K?KAKAE??Zg@??^q@??Xk@??`@y@Xi@Zm@??Zi@Xc@HK??HIRWNQRO\\UTMXM??\\KXGVE??PDJARC??DDF@DA??DEBI@M?MAK??L_@Lg@Lo@Hk@Fs@Dq@??DgA??Bq@B}@@g@???c@?kA?]???W???o@By@Bk@Fg@Hg@??Pm@Rg@P]??PSJM??HEJE??JCLA??f@@jBHh@Dj@Fj@HZF??j@J??VB??R?XG??LGNK??JQHS??HUFYFe@??Fs@Di@Dm@D_@D_@??Ji@??H[HW??J_@Vq@f@uA??|AqEL[LW??LQPQNM??^Q??AeD??CaB??Cq@Cg@Gk@Kg@Qk@Oa@OUqIaL??}AqB??sEmG??Ya@??gCkD??_DgE??kA_Bu@cAU_@We@Qe@??M_@Oi@Mi@??Qw@??UgA??UgAsAcH??[}A??a@wB??k@sC??iCyM??mCgNWoAWkA??S}@[sA]sAAE??Su@??Uu@eAkD??So@??o@mBYu@Wq@??OYMQKKKG??BS??TwBJy@Fg@??Fa@Lk@Le@??Re@??P[PSTOVKTGTCV@??`@FpATZDV?RC??PGTKb@Wp@c@??d@[??NKLMJOHUH_@F_@Ho@F_@DS??FOFMHI??JCL?PFVLNHNDP@??PCNGPKTQNMNI??TGXE`@E??^C??TCVGVI??TMZQVQ??n@c@??^Y??XU??PMJMJQJWJ]He@Fi@Dk@Dk@??Fi@Hk@Ha@DS??DOJ]N[LSJM??DA??XFRFTHXLNDP@D???F?PCJELI??DABA??DEBGBM???M??JYL[LYLUPYV_@??BDB@D???Jb@Lb@Ld@FXDZB\\@\\?`@??C^EXGRIJ??IDI???IEKKQW??K[ISMQ??WmAIi@Ga@Gu@SyB??G{@Ei@??m@uI??i@qHUqC??KqAEa@CSIs@??EYE]Ga@SqA??UsB??a@mDi@_Em@wE??Ik@c@wC]sB{@iE??g@{B_@qB_@iCg@qE??WwC[_D??QkB]eDGg@??m@cG??Gm@??CWIo@??UoB{@gH[}Bs@kF??e@cDk@{DcAeHYqB??M}@Q_BOcBGsAGaB??GmB??AQMgBQ}AOgAKq@??O{@]wASq@mA}Cm@eBe@}Au@yCm@qCc@yC??MiA??OwBIwACyA?kA@eADy@B_AF}A??JeAP_B??dAmJ??R}A??NmA??@MVeBVkANg@??Ro@v@iB??z@_BP[??NUf@y@Te@??RYNa@L_@No@Ns@Lu@Hq@Fw@FsA??BeA@q@@s@???}@Aq@Ac@??BC@C??BI@OAOAI??AECE??IEGCGA??G?G???EWEUEO??IQ??KeA??AIUwCGw@??IkA??IcA??y@aK??KuA??q@{H??Gs@??L]@cC??Di@BQBMBOJe@??v@gA|@aANQR]P]\\{@??Lc@DWDUF[Fg@??NeB^wCDSRq@??P]hBoB??h@k@??PQ??^]RMNGj@ENA??j@E`@GLEVM^[??\\c@b@s@??z@_C??t@wB??n@wA??\\u@HWH[TuA??bAsF??p@wD??Dc@Bi@@WBmB??@mA??BcB??@_D??FwFBsA??F}C?SAg@??Ca@GWWoA??k@uB??gAiE??EO??]oA??u@kCI]G]UgB??OiAIs@??WoB??QeAGOGC??BI@I?IAMAGCI??CE??@U?YC[??Gi@??UmB[mC??MaA??Ky@CYCg@EgA??C{@EiB??Ae@?_@???[A_@???IAK??JILOJS??JUNc@??Xu@h@sA??|A{D??`@cAJWHU??HY??FW??Ha@H_@H]FUFU";
string f = DecodePolylinePoints(encodedString);
f="52.5184278,13.3838763,52.5181997,13.3804357,52.5180817,13.3804572,52.5178671,13.3776355,52.5178349,13.3773029,52.5177491,13.3768845";
string[] HereLineString = f.Split(',');
string hereEncodedRoute = String.Empty;
for(var i = 0; i < HereLineString.Length; i += 2)
var lat = HereLineString[i];
var lng = HereLineString[i+1];
string dth = DoubleToHex(Convert.ToDouble(lat)) + DoubleToHex(Convert.ToDouble(lng));
string hta = HexToAscii(dth);
var result = encoding(hta).Replace("=","").Replace("+","-").Replace("\\","_");
hereEncodedRoute = hereEncodedRoute + ",e." + result;
Console.WriteLine(result);
Console.WriteLine(hereEncodedRoute);
public string encoding(string toEncode)
byte[] bytes= Encoding.GetEncoding(28591).GetBytes(toEncode);
string toReturn = System.Convert.ToBase64String(bytes);
private string DoubleToHex(double dbVal)
string mantissa = intToBinary((int)dbVal)+"."+fractionToBinary(dbVal-(int)dbVal);
if(mantissa.Substring(0,1) == "0")
exponent = mantissa.IndexOf('.') - mantissa.IndexOf('1') + 127;
exponent = mantissa.IndexOf('.') - 1 + 127;
mantissa = mantissa.Replace(".", "");
mantissa = mantissa.Substring(mantissa.IndexOf('1')+1);
mantissa = mantissa.Substring(0,23);
while(mantissa.Length<23){
mantissa = mantissa +"0";
var exp = intToBinary(exponent);
var numberFull = sign + exp + mantissa;
var hex = BinaryStringToHexString(numberFull);
private string intToBinary(int dbVal)
return Convert.ToString(dbVal,2);
public string BinaryStringToHexString(string binary)
StringBuilder result = new StringBuilder(binary.Length / 8 + 1);
int mod4Len = binary.Length % 8;
binary = binary.PadLeft(((binary.Length / 8) + 1) * 8, '0');
for (int i = 0; i < binary.Length; i += 8)
string eightBits = binary.Substring(i, 8);
result.AppendFormat("{0:X2}", Convert.ToByte(eightBits, 2));
return result.ToString();
private string fractionToBinary(double dbVal)
for (int i = 0; i < 46; i++)
public string Base64Encode(string plainText) {
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
return System.Convert.ToBase64String(plainTextBytes);
public string HexToAscii(String hexString)
string ascii = string.Empty;
for (int i = 0; i < hexString.Length; i += 2)
String hs = string.Empty;
hs = hexString.Substring(i,2);
uint decval = System.Convert.ToUInt32(hs, 16);
char character = System.Convert.ToChar(decval);
catch (Exception ex) { Console.WriteLine(ex.Message); }
private string DecodePolylinePoints(string encodedPoints)
string decodedString = string.Empty;
if (encodedPoints == null || encodedPoints == "") return null;
List<string[]> poly = new List<string[]>();
char[] polylinechars = encodedPoints.ToCharArray();
string[] latlng = new string[2];
while (index < polylinechars.Length)
next5bits = (int)polylinechars[index++] - 63;
sum |= (next5bits & 31) << shifter;
} while (next5bits >= 32 && index < polylinechars.Length);
if (index >= polylinechars.Length)
currentLat += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);
next5bits = (int)polylinechars[index++] - 63;
sum |= (next5bits & 31) << shifter;
} while (next5bits >= 32 && index < polylinechars.Length);
if (index >= polylinechars.Length && next5bits >= 32)
currentLng += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);
latlng[0] = (currentLat / 100000.0).ToString(new CultureInfo("en-US"));
latlng[1] = (currentLng / 100000.0).ToString(new CultureInfo("en-US"));
decodedString = decodedString+",["+latlng[0]+","+latlng[1]+"]";
return (decodedString.Substring(2,decodedString.Length-3)).Replace("],[",",");