URL Encoding?
vining
Posts: 4,368
I'm finishing up a module for Axis PTZ cameras and I realized after a bit of time I needed to encode or escape certain characters I was sending to the camera when creating named presets from the TP. The first function I wrote required a lookup table to determine which characters needed to be encoded and then a 2nd lookup table contained the encoding.
This worked great but I wasn't satisfied and wanted it shorter and simpler.
So I tried this route which doesn't require any look up tables and easier to throw into a module. When testing this version if you look at the print out in the diagnostics window where I should be getting %20 for the space after the word light I always get %70 (lower case p) in my string being sent to the camera. The camera receives this string and I get a button ofn the TP that reads " street lightp& ( pole) , , , .
Any ideas as to what could be causing this? ITOHEX?. I can always go back to my original version but I'd like to know what's the deal.
Diagnostic window:
This worked great but I wasn't satisfied and wanted it shorter and simpler.
DEFINE_CONSTANT //URL ENCODING URL_ENCODE_NUM_CHARS = 23 ; VOLATILE CHAR cURL_ENCODE_CHARS[URL_ENCODE_NUM_CHARS] = {// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ';', '?', '/', ':', '#', '&', '=', '+', '$', ',', ' ', '%', '<', '>', '~', '{', '}', '[', ']', '|', '\', '`', '^' }// | | | | | | | | | | | | | | | | | | | | | | | VOLATILE CHAR cURL_ENCODE_ESCAPED[URL_ENCODE_NUM_CHARS][3] = {// | | | | | | | | | | | | | | | | | | | | | | | '%3B','%3F','%2F','%3A','%23','%26','%3D','%2B','%24','%2C','%20','%25','%3C','%3E','%7E','%7B','%7D','%5B','%5D','%7C','%5C','%60','%5E' }// | | | | | | | | | | | | | | | | | | | | | | | DEFINE_FUNCTION CHAR[AXIS_PRESET_NAME_LEN * 3] fnURL_Encode(CHAR iStr[]) { STACK_VAR INTEGER i ; STACK_VAR INTEGER r ; STACK_VAR INTEGER nLenURLStr ; STACK_VAR CHAR cURL_EncodeStr[AXIS_PRESET_NAME_LEN * 3] ;//must be bigger. you might be swapping 1 char for 3! fnAxis_DeBug("'URL Encode In: ',iSTR,'.>-line-<',ITOA(__LINE__),'>'") ; nLenURLStr = length_string(iStr) ; for(i = 1 ; i <= nLenURLStr ; i ++) { for(r = 1 ; r <= URL_ENCODE_NUM_CHARS ; r ++) { if(iStr[i] == cURL_ENCODE_CHARS[r]) { cURL_EncodeStr = "cURL_EncodeStr,GET_BUFFER_STRING(iStr,i-1),cURL_ENCODE_ESCAPED[r]" ; GET_BUFFER_CHAR(iStr) ; nLenURLStr = length_string(iStr) ; r = URL_ENCODE_NUM_CHARS + 1 ; i = 0 ; } } } fnAxis_DeBug("'URL Encode Out: ',cURL_EncodeStr,iStr,'.>-line-<',ITOA(__LINE__),'>'") ; RETURN "cURL_EncodeStr,iStr" ; }
So I tried this route which doesn't require any look up tables and easier to throw into a module. When testing this version if you look at the print out in the diagnostics window where I should be getting %20 for the space after the word light I always get %70 (lower case p) in my string being sent to the camera. The camera receives this string and I get a button ofn the TP that reads " street lightp& ( pole) , , , .
Any ideas as to what could be causing this? ITOHEX?. I can always go back to my original version but I'd like to know what's the deal.
DEFINE_FUNCTION CHAR[AXIS_PRESET_NAME_LEN * 3] fnURL_Encode_2(CHAR iStr[]) { STACK_VAR INTEGER i ; STACK_VAR INTEGER nLenURLStr ; STACK_VAR CHAR cURL_EncodeStr[AXIS_PRESET_NAME_LEN * 3] ;//must be bigger. you might be swapping 1 char for 3! fnAxis_DeBug("'URL Encode In: ',iSTR,'.>-line-<',ITOA(__LINE__),'>'") ; nLenURLStr = length_string(iStr) ; for(i = 1 ; i <= nLenURLStr ; i ++) { if(iStr[i] > 31 && iStr[i] < 48 || iStr[i] > 57 && iStr[i] < 65 || iStr[i] > 90 && iStr[i] < 97 || iStr[i] > 122 && iStr[i] < 127) { cURL_EncodeStr = "cURL_EncodeStr,GET_BUFFER_STRING(iStr,i-1),'%',ITOHEX(iStr[i])" ; GET_BUFFER_CHAR(iStr) ; nLenURLStr = length_string(iStr) ; i = 0 ; } } fnAxis_DeBug("'URL Encode Out: ',cURL_EncodeStr,iStr,'.>-line-<',ITOA(__LINE__),'>'") ; RETURN "cURL_EncodeStr,iStr" ; }
Diagnostic window:
Line 19 (20:28:40):: AXISCAM MOD Instance 3: URL Encode In: street light & ( pole ) , , ,...>-line-<1787> Line 20 (20:28:40):: AXISCAM MOD Instance 3: URL Encode Out: street%20light%70%26%20%28%20pole%20%29%20%2C%20%2C%20%2C%2E%2E.>-line-<1800>
0
Comments
Try this simple change and you should be okay:
HTH