'Programming/General Topics'에 해당되는 글 10건

  1. 2010.08.10 고급 Bash 스크립팅 가이드
  2. 2010.06.28 URL Encoder
  3. 2010.06.28 BSTR(BASIC string)
  4. 2010.06.28 Sleep(0) 과 Sleep(1) 의 차이
  5. 2010.06.12 C의 메모리 관리 구조
  6. 2009.10.02 exec() family
  7. 2009.10.02 strerror()
  8. 2009.10.02 perror()
  9. 2009.10.02 Programming Problems 2.22
  10. 2009.10.02 저수준 파일 입출력 함수
www.codeguru.com/cpp/cpp/cpp_mfc/article.php/c4029/

URL Encoding

Chandrasekhar Vuppalapati (view profile)
May 22, 2003
Environment: VC++, MFC

Introduction

The purpose of the article is to design a C++ class that does URL encoding. The motivation behind this article was that, in my previous project, I need to post data from a VC++ 6.0 application, which was required to be URL encoded. I have searched the MSDN to include a class or API that returns a URL encoded value for a given string input, but I haven't found one. So, I had to come out with my own URLEncode C++ class.

The URLEncoder.exe is a MFC dialog-based application that uses the URLEncode class.

Process

URL encoding is a special process that makes sure that all the characters are "safe" to transmit across the Internet. Some characters have special meaning to various programs involved in sending the data across the Internet.

For example, a carriage return has an ASCII value of 13. Programs involved in sending you "FORM" data may consider this to mean the end of a line of data.

Traditionally, all Web applications transfer data between the client and server by using the HTTP or HTTPS protocols. There are basically two ways in which a server receives input from a client:

  1. Data can be passed in the HTTP headers (either via cookies or a posted form), or
  2. It can be included in the query portion of the requested URL.

When data is included in a URL, it must be specially encoded to conform to proper URL syntax. On the Web server side, the data is automatically decoded. Consider the following URL, where data is posted as a query string parameter.

Example: http://WebSite/ResourceName?Data=Data

Where Web Site is the URL Name
Resource Name is either the ASP or Servlet Name.
Data is the one that is to be posted to the Web Server. This requires to be encoded if the MIME type is .Content-Type: application/x-www-form-urlencoded.

RFC 1738

The RFC 1738 specification defining Uniform Resource Locators (URLs) restricts the characters allowed in a URL to a subset of the US-ASCII character set. This poses a limitation because HTML, on the other hand, allows the entire range of the ISO-8859-1 (ISO-Latin) character set to be used in documents. This leads to the case of, if the data to be uploaded is in the form HTML post (or as a part of Query string), all the HTML data to be encoded.

ISO-8859-1 (ISO-Latin) Character Set

The following table, ISO-8859-1, contains the complete ISO-8859-1 (ISO-Latin) character set, corresponding to the first 256 entries. The table provides each character ISO 8859-1Position(its decimal code), Description, Entity Number, Hex-Decimal Values, and HTML Result. Broadly, the range can be divided into Safe and Unsafe characters as follows.

Character range(decimal) Type Values Safe/Unsafe
0-31 ASCII Control Characters These characters are not printable Unsafe
32-47 Reserved Characters ' '!?#$%&'()*+,-./ Unsafe
48-57 ASCII Characters and Numbers 0-9 Safe
58-64 Reserved Characters :;<=>?@ Unsafe
65-90 ASCII Characters A-Z Safe
91-96 Reserved Characters [\]^_` Unsafe
97-122 ASCII Characters a-z Safe
123-126 Reserved Characters {|}~ Unsafe
127 Control Characters ' ' Unsafe
128-255 Non-ASCII Characters ' ' Unsafe

All the ASCII characters that are unsafe are required to encoded; for example, ranges (32-47, 58-64, 91-96, 123-126).

Below is the table that describes why these characters are not safe.

Character Unsafe Reason Character Encode
"<" Delimiters around URLs in free text %3C
> Delimiters around URLs in free text %3E
. Delimits URLs in some systems %22
# It is used in the World Wide Web and in other systems to delimit a URL from a fragment/anchor identifier that might follow it. %23
{ Gateways and other transport agents are known to sometimes modify such characters %7B
} Gateways and other transport agents are known to sometimes modify such characters %7D
| Gateways and other transport agents are known to sometimes modify such characters %7C
\ Gateways and other transport agents are known to sometimes modify such characters %5C
^ Gateways and other transport agents are known to sometimes modify such characters %5E
~ Gateways and other transport agents are known to sometimes modify such characters %7E
[ Gateways and other transport agents are known to sometimes modify such characters %5B
] Gateways and other transport agents are known to sometimes modify such characters %5D
` Gateways and other transport agents are known to sometimes modify such characters %60
+ Indicates a space (spaces cannot be used in a URL) %20
/ Separates directories and subdirectories %2F
? Separates the actual URL and the parameters %3F
& Separator between parameters specified in the URL %26

How It Is Done

URL encoding of a character is done by taking the character's 8-bit hexadecimal code and prefixing it with a percent sign ("%"). For example, the US-ASCII character set represents a space with decimal code 32, or hexadecimal 20. Thus, its URL-encoded representation is %20.

URLEncode: URLEncode is a C++ class, which does URL encoding for a given string of data. The CURLEncode class has the following member functions.

  • isUnsafeString
  • decToHex
  • convert
  • URLEncode

The URLEncode() method does the encoding process. URLEncode checks each character in the string to see whether the character is safe or unsafe (isUnsafe). If the character is unsafe, the character is replaced with the .%. HEX value (convert) and appended to the original string.

Code Snippet

class CURLEncode
{
private:
  static CString csUnsafeString;
  CString (char num, int radix);
  bool isUnsafe(char compareChar);
  CString convert(char val);

public:
  CURLEncode() { };
  virtual ~CURLEncode() { };
  CString (CString vData);
};

bool CURLEncode::isUnsafe(char compareChar)
{
  bool bcharfound = false;
  char tmpsafeChar;
  int m_strLen = 0;
  
  m_strLen = csUnsafeString.GetLength();
  for(int ichar_pos = 0; ichar_pos < m_strLen ;ichar_pos++)
  {
    tmpsafeChar = csUnsafeString.GetAt(ichar_pos);
    if(tmpsafeChar == compareChar)
    {
      bcharfound = true;
      break;
    }
  }
  int char_ascii_value = 0;
  //char_ascii_value = __toascii(compareChar);
  char_ascii_value = (int) compareChar;

  if(bcharfound == false &&  char_ascii_value > 32 &&
                             char_ascii_value < 123)
  {
    return false;
  }
  // found no unsafe chars, return false
  else
  {
    return true;
  }

  return true;
}

CString CURLEncode::decToHex(char num, int radix)
{
  int temp=0;
  CString csTmp;
  int num_char;

num_char = (int) num;
  if (num_char < 0)
    num_char = 256 + num_char;

  while (num_char >= radix)
    {
    temp = num_char % radix;
    num_char = (int)floor(num_char / radix);
    csTmp = hexVals[temp];
    }

  csTmp += hexVals[num_char];

  if(csTmp.GetLength() < 2)
  {
    csTmp += '0';
  }

  CString strdecToHex(csTmp);
  // Reverse the String
  strdecToHex.MakeReverse();

  return strdecToHex;
}

CString CURLEncode::convert(char val)
{
  CString csRet;
  csRet += "%";
  csRet += decToHex(val, 16);
  return  csRet;
}

URLEncoder

References

URL Encoding: http://www.blooberry.com/indexdot/html/topics/urlencoding.htm.

RFC 1866: The HTML 2.0 specification (plain text). The appendix contains the Character Entity table: http://www.rfc-editor.org/rfc/rfc1866.txt.

The Web version of the HTML 2.0 (RFC 1866) Character Entity table: http://www.w3.org/MarkUp/html-spec/html-spec_13.html.

The HTML 3.2 (Wilbur) recommendation [This includes all character entities listed in HTML 2.0, plus new named entities covering the ISO 8859-1 120-191 range.]: http://www.w3.org/MarkUp/Wilbur/.

The HTML 4.0 Recommendation [Includes new Unicode character entities]: http://www.w3.org/TR/REC-html40/.

The W3C HTML Internationalization area: http://www.w3.org/International/O-HTML.html.

Downloads

URLEncoder Source Code - 42 Kb

'Programming > General Topics' 카테고리의 다른 글

고급 Bash 스크립팅 가이드  (0) 2010.08.10
URL Encoder  (0) 2010.06.28
BSTR(BASIC string)  (0) 2010.06.28
Sleep(0) 과 Sleep(1) 의 차이  (0) 2010.06.28
C의 메모리 관리 구조  (0) 2010.06.12
exec() family  (0) 2009.10.02
Posted by exahz
TAG Encoder, URL

BSTR 은 기본적으로 유니코드 글자들의 배열이다.

c++ 에서 BSTR 사용하기  
BSTR b1;

// 어떤 문장을 포함하는 새로운 BSTR 할당
b1 = SysAllocString(L "Testing BSTs");

//BSTR 표시
wprintf("%s",b1); 

//바이트 수 표시(ANSI 글자당 두 바이트)
wprintf("%s" bytes \n", SysStringByteLen(b1));

//글자 수 표시
wrpintf(L"%d" characters\n", SysStringLen(b1));

//BSTR 해제
SysFreeString(b1);

함수 명

SysAllocString : BSTR을 할당하고 문자열을 그 안으로 복사한다.
SysAllocStringByelen : ANSI 입력 문자열을 받아서 BSTR을 리턴한다.
SysAllocStringLen : 새로운 BSTR을 할당하고 지정한 개수의 글자를 복사한 후  null 문자를 추가한다.
SysFreeString : BSTR을 해제한다.
SysReAllocString : 새로운 BSTR을 할당하고 전달된 문자열을 복사한 후 예전 BSTR을 해제한다.
SysReAllocStringLen : 이전 BSTR에서 지정한 개수의 글자를 포함하는 새로운 BSTR을 생성하고 이전 BSTR은 해제한다.
SysStringByteLen BSTR의 길이(바이트 단위)를 리턴한다.
SysStringLen BSTR의 길이를 리턴한다.


'Programming > General Topics' 카테고리의 다른 글

고급 Bash 스크립팅 가이드  (0) 2010.08.10
URL Encoder  (0) 2010.06.28
BSTR(BASIC string)  (0) 2010.06.28
Sleep(0) 과 Sleep(1) 의 차이  (0) 2010.06.28
C의 메모리 관리 구조  (0) 2010.06.12
exec() family  (0) 2009.10.02
Posted by exahz

sleep(0)은 같은 우선순위의 쓰레드 끼리의 컨텍스트 스위칭.
sleep(1)은 같은 우선순위에 상관없이 전체 쓰레드 끼리의 컨텍스트 스위칭.

'Programming > General Topics' 카테고리의 다른 글

URL Encoder  (0) 2010.06.28
BSTR(BASIC string)  (0) 2010.06.28
Sleep(0) 과 Sleep(1) 의 차이  (0) 2010.06.28
C의 메모리 관리 구조  (0) 2010.06.12
exec() family  (0) 2009.10.02
strerror()  (0) 2009.10.02
Posted by exahz

동적 할당: 힙에 메모리를 할당
정적 할당: 스택과 데이터 영역에 할당

데이터 영역(Data area)
: 데이터 영역은 전역변수와 static 변수가 할당되는 영역이다. 이 영역에 할당되는 변수들은 일반적으로 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야만 메모리에서 소멸된다.

스택 영역(Stack area)
: 스택 영역은 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역이다. 이 영역에 할당된 변수는 함수 호출이 완료되면 사라진다.

힙 영역(Heap area)
: 힙은 프로그래머가 관리하는 메모리 영역이며 필요에 의해 메모리 공간을 할당, 소멸 할 수 있다. (따라서, 동적 할당)

'Programming > General Topics' 카테고리의 다른 글

BSTR(BASIC string)  (0) 2010.06.28
Sleep(0) 과 Sleep(1) 의 차이  (0) 2010.06.28
C의 메모리 관리 구조  (0) 2010.06.12
exec() family  (0) 2009.10.02
strerror()  (0) 2009.10.02
perror()  (0) 2009.10.02
Posted by exahz
execl, execlp, execle, execv, execvp - execute a file  

SYNOPSIS

#include <unistd.h>

extern char **environ;

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg , ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);  

DESCRIPTION

The exec family of functions replaces the current process image with a new process image. The functions described in this manual page are front-ends for the function execve(2). (See the manual page for execve for detailed information about the replacement of the current process.)

The initial argument for these functions is the pathname of a file which is to be executed.

The const char *arg and subsequent ellipses in the execl, execlp, and execle functions can be thought of as arg0, arg1, ..., argn. Together they describe a list of one or more pointers to null-terminated strings that represent the argument list available to the executed program. The first argument, by convention, should point to the file name associated with the file being executed. The list of arguments must be terminated by a NULL pointer.

The execv and execvp functions provide an array of pointers to null-terminated strings that represent the argument list available to the new program. The first argument, by convention, should point to the file name associated with the file being executed. The array of pointers must be terminated by a NULL pointer.

The execle function also specifies the environment of the executed process by following the NULL pointer that terminates the list of arguments in the parameter list or the pointer to the argv array with an additional parameter. This additional parameter is an array of pointers to null-terminated strings and must be terminated by a NULL pointer. The other functions take the environment for the new process image from the external variable environ in the current process.

Some of these functions have special semantics.

The functions execlp and execvp will duplicate the actions of the shell in searching for an executable file if the specified file name does not contain a slash (/) character. The search path is the path specified in the environment by the PATH variable. If this variable isn't specified, the default path ``:/bin:/usr/bin'' is used. In addition, certain errors are treated specially.

If permission is denied for a file (the attempted execve returned EACCES), these functions will continue searching the rest of the search path. If no other file is found, however, they will return with the global variable errno set to EACCES.

If the header of a file isn't recognized (the attempted execve returned ENOEXEC), these functions will execute the shell with the path of the file as its first argument. (If this attempt fails, no further searching is done.)  

RETURN VALUE

If any of the exec functions returns, an error will have occurred. The return value is -1, and the global variable errno will be set to indicate the error.  

SEE ALSO

sh(1), execve(2), fork(2), environ(5), ptrace(2)  

refer to : http://linux.about.com/library/cmd/blcmdl3_execlp.htm

'Programming > General Topics' 카테고리의 다른 글

Sleep(0) 과 Sleep(1) 의 차이  (0) 2010.06.28
C의 메모리 관리 구조  (0) 2010.06.12
exec() family  (0) 2009.10.02
strerror()  (0) 2009.10.02
perror()  (0) 2009.10.02
Programming Problems 2.22  (0) 2009.10.02
Posted by exahz

strerror() : 시스템 에러 메시지를 반환.

용도:
#include <string.h>

char *strerror(int errnum);

파라메터:
errnum: 에러 메시지 번호

반환 값:
에러가 있다면 에러메시지를 반환하고 없으면 return 하지 않음.

strerror()는 에러 번호가 가리키는 에러 메시지 문자열의 주소를 반환한다. strerror()는 어떤 종류의 에러가 있는지 확인하기 위한 용도로도 사용할 수 있지만, 대부분은 발생한 에러를 확인하기 위해 사용된다. 따라서 전역 변수인 errno와 함께 사용된다. 또한 strerror()는 에러 메시지가 위치한 주소를 알려줄 뿐이므로 별도의 출력 함수와 함께 사용하게 된다.

ex) printf("error: %s\n", strerror(errno));
이것은 다음의 코드와 같다.

ex) perror("error");

errno 전역 변수는 에러가 발생할 때마다 운영체제가 기록하는 전역 변수이다. 스레드 안전(thread-safe) 유무에 따라 전역 변수이기도 하고 함수를 호출한 결과에 * 연산자를 붙여서 사용하기도 한다. 여기서는 편의상 전역 변수라고 부른다.

errno 전역 변수는 프로그램이 시작할 때 "에러가 발생하지 않았다"는 뜻의 0으로 시작해서, 에러가 발생할 때마다 새로운 에러 번호로 갱신된다. 매번 에러가 발생할 때마다 갱신되기 때문에 strerror()를 사용하는 올바른 방법은 에러가 발생하자마자 결과를 확인하는 것이다. 결과를 나중에 확인하면 이후에 발생한 에러로 인해 우리가 원하는 에러가 아닌, 이후에 발생한 에러메시지가 나올 수 있다.
errno 전역 변수는 매번 갱신되는 것이 아니라 에러가 발생할 때마다 갱신된다. 에러가 발생한 이후에 errno 전역 변수를 초기화하고 싶다면, 아래 코드처럼 직접 0을 넣어주면 된다.
ex) errno = 0;

strerror()가 반환한 포인터는 운영체제에서 사용하는 공간이기 때문에 해제하려는 시도는 치명적인 결과를 가져올 수 있다.
또한 반환한 포인터를 이용해서 에러 메시지 문자열을 변경하려고 해서도 안된다.

이름  설명  반환값  매개 변수  errno
 strerror  에러 메시지 반환  char*  에러 번호  매개 변수로 전달해서 사용
 perror  에러 메시지 출력  void  출력 메시지 앞에 놓일 문자열  내부에서 무조건 사용


ex)
#include <stdio.h>
#include <string.h>

void main()
{
    const char* errors[] =
    {
        "******",
        "EPERM", "ENOENT", "ESRCH", "EINTR", "EIO", "ENXIO", "E2BIG", "ENOEXEC", "EBADF", "ECHILD",
        "EAGAIN", "ENOMEM", "EACCES", "EFAULT", "******", "EBUSY", "EEXIST", "EXDEV", "ENODEV", "ENOTDIR",
        "EISDIR", "EINVAL", "ENFILE", "EMFILE", "ENOTTY", "******", "EFBIG", "ENOSPC", "ESPIPE", "EROFS",
        "EMLINK", "EPIPE", "EDOM", "ERANGE", "******", "EDEADLK", "******", "ENAMETOOLONG", "ENOLCK", "ENOSYS",
        "ENOTEMPTY", "EILSEQ", "******"
    };

    int i;
    printf( "--------------------------------------------------\n" );
    printf( "no name         description\n" );
    printf( "--------------------------------------------------\n" );

    for( i = 0; i <= 43; i++ )
        printf( "%2d %-12s %s\n", i, errors[i], strerror(i) );

    printf( "--------------------------------------------------\n" );
}

'Programming > General Topics' 카테고리의 다른 글

C의 메모리 관리 구조  (0) 2010.06.12
exec() family  (0) 2009.10.02
strerror()  (0) 2009.10.02
perror()  (0) 2009.10.02
Programming Problems 2.22  (0) 2009.10.02
저수준 파일 입출력 함수  (0) 2009.10.02
Posted by exahz
perror() 시스템 에러 메시지를 출력한다.

용도:
#include <stdio.h>

void perror(const char *str);

파라메터:
str: 에러 메시지와 함께 출력할 문자열.

반환 값: 없음.

'Programming > General Topics' 카테고리의 다른 글

C의 메모리 관리 구조  (0) 2010.06.12
exec() family  (0) 2009.10.02
strerror()  (0) 2009.10.02
perror()  (0) 2009.10.02
Programming Problems 2.22  (0) 2009.10.02
저수준 파일 입출력 함수  (0) 2009.10.02
Posted by exahz
TAG perror, 에러

#include <stdio.h>
#include <fcntl.h>
#define PMODE 0644

int main(int argc, char *argv[])
{
   int fdin, fdout, count, total;
   char *buf[BUFSIZ];

   if (argc!=3){
      fprintf(stderr, "Usage: %s.exe <filein> <fileout>", argv[0]);
      exit(1);
   }
   if ((fdin=open(argv[1], O_RDONLY))==-1){
      perror(argv[1]);
      exit(2);
   }
   if((fdout=open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, PMODE))==-1){
      perror(argv[2]);
      exit(3);
   }
   total=0;
   while((count=read(fdin, buf, BUFSIZ))>0){
      total+=count;
      write(fdout, buf, count);
   }
   printf("total %d byte(s) was written.\nSuccess!!", total);
   return 0;
}

/* PMODE */
Permission 을 준다.
644는 현재 user, group, other 순이고
최대 777의 권한을 줄 수 있다.
첫째 user의 권한은 6이고 이것을 2진수로 바꾸면 110이다.
따라서 읽기, 쓰기, 실행 권한 중에 읽기와 쓰기가 가능하는 뜻이며
group은 4 -> 100, 따라서 읽기만 가능하다.

'Programming > General Topics' 카테고리의 다른 글

C의 메모리 관리 구조  (0) 2010.06.12
exec() family  (0) 2009.10.02
strerror()  (0) 2009.10.02
perror()  (0) 2009.10.02
Programming Problems 2.22  (0) 2009.10.02
저수준 파일 입출력 함수  (0) 2009.10.02
Posted by exahz
TAG 소스, 코드

open(), read(), write(), close(), lseek(), ioctl() 등.

1. open() 함수
형식:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char* pathname, int flags [, mode_t mode]);

용도 :
디바이스 파일을 읽거나 쓰기 위해 파일을 연다. 이때 flags에 지정한 속성으로 pathname에 지정한 이름의 파일을 연다.

매개변수:
pathname: 오픈할 디바이스 파일의 이름(경로 포함)
flags: 디바이스 파일에 접근하는 방식 (OR연산자로 여러 flag를 한꺼번에 지정할수도 있다.)
mode : 파일을 닫을 때 설정할 권한 설정

 flags 의미 
 O_RDONLY  읽기 전용
 O_WRONLY  쓰기 전용
 O_RDWR  읽기 및 쓰기
 O_CREAT  파일 생성(파일이 존재하면 작업 안함)
 O_TRUNC  파일 크기를 0으로 연다. O_CREAT와 함께 사용한다.
 O_NONBLOCK, O_NDELAY  비블록 모드 
 O_SYNC  쓰기의 동기화, 디바이스 파일에 쓰기를 하면 물리적인 하드웨어에 기록될 때까지 태스크는 블록됨.
 O_NOCTTY  터미널 디바이스 파일인 경우 직렬 디바이스로 속성 설정.
 O_BINARY, O_TEXT  문서를 바이너리로 열거나 텍스트 모드로.

반환 값: 성공 시 파일 디스크립터 값을 반환하고, 실패 시 -1을 반환한다.

2. close() 함수
형식:
#include <unistd.h>
int close(int fd);

용도: open()함수에서 반환한 파일 디스크립터 fd에 해당하는 디바이스 파일을 닫는다.

매개변수:
fd: 파일 디스크립터

반환 값: 성공 시 0을 반환하고, 실패 시 -1을 반환한다.

3. read() 함수
형식:
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

용도:
디바이스 파일로부터 데이터를 읽는다. 파일 디스크립터 fd를 가지는 디바이스 파일에서 buf로 시작하는 버퍼에 count 크기의 바이트를 읽는다. 만일 count가 0이라면 0을 반환한다. count값은 SSIZE_MAX보다 작아야 하며, 만일 count가 SSIZE_MAX보다 크다면 결과는 예측할 수 없다.

매개변수:
fd: 파일 디스크립터
buf: 읽은 데이터가 저장될 메모리 공간의 주소
count: 데이터 크기

반환 값:
성공 시 읽은 바이트 수를 반환하며, 실패 시 -1을 반환한다. 이때 성공하는 경우 파일 포인터의 위치는 읽은 크기만큼 이동한다.

4. write() 함수
형식:
#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

용도: 디바이스 파일에 데이터를 쓴다. buf가 가리키는 버퍼에서 파일 디스크립터 fd를 가지는 파일에 count 바이트 크기의 데이터를 쓴다. 이때 count값은 SSIZE_MAX보다 작아야 한다.

'Programming > General Topics' 카테고리의 다른 글

C의 메모리 관리 구조  (0) 2010.06.12
exec() family  (0) 2009.10.02
strerror()  (0) 2009.10.02
perror()  (0) 2009.10.02
Programming Problems 2.22  (0) 2009.10.02
저수준 파일 입출력 함수  (0) 2009.10.02
Posted by exahz

티스토리 툴바