아스키 코드 값을 10진수로 바꾸고 싶습니다.

fat81의 이미지

안녕하세요~
프로그래밍을 하다가 궁금한 것이 질문 드립니다.
제가 하고 싶은것은

buf[0] = 50
buf[1] = 51
buf[2] = 102
buf[3] = 100
....

이런식으로 buf 배열안에 아스키 코드 값이 들어 있습니다.
그런데 이것을 십진수의 값이 들어가도록 만들고 싶습니다.

buf[0] = 2
buf[1] = 3
buf[2] = f
buf[3] = d
...

이런식으로요. 이와 관련한 글을 찾다가, atoi 라는 함수를 찾았습니다. 그런데 이상하게도 숫자가 아닌 문자에서는

buf[2] = 102

제대로 동작을 안하네요. 리턴 값이 0 으로 나옵니다.
답변 부탁드립니다.

hanzo69의 이미지

f 하고 d는 16진수에나 나오는 디지트입니다만...

아무튼 atoi 는 버퍼의 각 문자들을 그대로 10진수로 바꿔주는게 아니고 문자열 전체를 10진수 문자열로 보고 처리합니다.
"100"
이런 문자열을 처리케 하면
버퍼에 {1,0,0}을 넣는게 아니고 반환값으로 100이란 정수를 반환하죠.

각 바이트를 별도로 변환하고 싶으시다면 각 바이트에서 '0' = 0x30 을 빼세요.

님ㅎ 즐~

서지훈의 이미지

질문이 너무 난해하네요?
대략 내용을 알듯알듯 하면서도 뭔가 모자라는 느낌이...?

전체 소스 코드랑 질문 내용을 정리를 해주셔야 할듯합니다.
그리고 atoi는 string number에 대해서만 변환을 해줍니다.
alphabet의 경우엔 안되는게 정상입니다. ㅡㅡㅋ

아마도 이런 답변을 듣고 싶지 않았을거 같으실텐데...
다시 한 번 정리해서 질문 올려 주시길 ~~~

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

fat81의 이미지

죄송합니다. 급한 마음에 적느라 제대로 설명을 못한 것 같습니다.

저는 현재 시리얼 포트를 통해서 파일을 전송한 다음에 flash 에 write 하려고 합니다.

참고로 전송한 파일은

22 1f c2 23 ac 23
23 1e 1c 3a 23 11
....

이런식으로 되어 있습니다. 파일을 보내는 host 쪽에서 hex 파일을 보내면, 받는 쪽에서는 하나의 문자씩 받은 것을 buf 배열에 저장을 합니다.
이때, 가장 처음의 22 에서의 '2' 의 경우 원래 데이터 값인 2 가 들어가야 하지만, 확인해보면 아스키코드 값인 50 이 buf[0] 배열에 들어갑니다.
이런식으로 말이죠.

buf[0] = 50
buf[1] = 50
buf[2] = 49
buf[3] = 102

그래서 buf[0] 에 들어가있는 아스키코드 50 을 원래의 값인 2 로 변환하려고 합니다.

참고로 flash 에 write 할 때는

buf[0] = 2
buf[1] = 2
buf[2] = 1
buf[3] = f
....

이런식으로 buf 배열을 구성하여 write 합니다.

litdream의 이미지

무식한 로직이 최고겠는데요?

unsigned short num_ascii(char c) {
   if ( '0' <= c && c <= '9' )  
      return c-'0';
   else if ( 'A' <= c && c <= 'F' ) 
      return tolower(c);
   else if ( 'a' <= c && c <= 'f' )
      return c;
   else
      return '\0';
}

삽질의 대마왕...

litdream의 이미지

그런데, 이렇게 하면 혹시 더 빠를까요? 아니면 차이가 없을까요?

unsigned short num_ascii2(char c) {
   switch(c) {
   case '0':
   case '1':
   case '2':
   case '3':
   case '4':
   case '5':
   case '6':
   case '7':
   case '8':
   case '9':
      return c-'0';
   case 'A':
   case 'B':
   case 'C':
   case 'D':
   case 'E':
   case 'F':
      return tolower(c);
   case 'a':
   case 'b':
   case 'c':
   case 'd':
   case 'e':
   case 'f':
      return c;
   default:
      return '\0';
   }
}

삽질의 대마왕...

fat81의 이미지

답변 해주신 분들 감사드립니다 :D

결국 switch 문을 써서 노가다(?)로 변환했습니다...

rhapsodist의 이미지

이런식으로요. 이와 관련한 글을 찾다가, atoi 라는 함수를 찾았습니다. 그런데 이상하게도 숫자가 아닌 문자에서는

buf[2] = 102

제대로 동작을 안하네요. 리턴 값이 0 으로 나옵니다.
답변 부탁드립니다.

==================================

strtoul 을 사용해보시지요..

buf[2] = (unsigned char)strtoul(strptr[i],NULL,16);

swellee의 이미지

전송하는 쪽에서 반드시 text mode로 보내야할 이유가 없다면
전송하는 쪽에서 binary mode로 전송하면 저런 변환과정도 필요 없을텐데...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.