안녕하세요. 4바이트형 10진수를 입력 받았을 시 이를 16진수로 변환하고
2바이트의 char 배열에 저장하기 위해 어떤 작업을 해야하는지 질문 드립니다..
만약 300 이란 10진수를 입력 받았을 시 16 진수로 고치면 12C 가 되는데.
이것을 어떻게 char buf[2] 에 저장하는건지 방법을 모르겠습니다..
각바이트를 출력 하면
01 2C
위와같이 출력 되야 합니다..
조언 부탁 드립니다..
C언어를 기준으로, 숫자형은 형이라고 한다면 대개의 경우 2진수입니다. C코드에서 100이라고 써도 실제로 컴파일되서 기계가 다룰때는 2진수로 다룬다는거죠. 따라서 그 4바이트형이 자료를 어떻게 가지고 있나, 보면 x86등의 little-endian의 경우 (16진수로 1바이트씩 보면)
2C 01 00 00
char[2] 를 short로 캐스팅해서 거기다 대입하고,
printf에서 %c 로 찍어주면 원하는 결과가 나오겠지요.
언제나 삽질 - http://tisphie.net/typo/ 프로그래밍 언어 개발 - http://langdev.net
uint32_t vid32 = 300; unsigned char tmp[2];
for (int i = 0, j=0; i < 4 ; i++,j++) { printf("%x\n",(unsigned char)((vid32>> (4-i)*8) & 0xFF)); } 위와 같이 하면, 2c 00 00 01 이 되네요.
위와 같은 상황에서 tmp[2] 에 입력 가능한 코드를 받아볼수 있을까요..
아래는 제가 작성한 소스인데. 일단 각 바이트에 1과 2c 는 들어가는것으로 보입니다.
맞는것인지요..
unsigned char low = (unsigned char)((vid32>>8) & 0xFF); unsigned char hi = (unsigned char)((vid32>>32) & 0xFF);
low = 1 hi = 2c
위 쓰신 코드는 잘못된 부분이 하나 있습니다. i가 0인경우, vid32>>32 를 계산하게 되지요.
K&R에 따르면, >> 연산에서 오른쪽 인자는 0보다 크거나 같고, 해당 자료형의 비트수보다 작아야합니다. 같거나 크면, 그 연산 결과는 정의되어있지 않음(undefined)입니다.
따라서, 결과를 보고 싶다면 다음과 같이 고쳐야 합니다.
uint32_t vid32 = 300; unsigned char tmp[2]; for (int i = 0, j=0; i < 4 ; i++,j++) { printf("%x\n",(unsigned char)((vid32>> (4-i-1)*8) & 0xFF)); }
결과는
0 0 1 2c
그렇다면 char a[2]; 에는 어떻게 넣을것인가..
nt main(){ unsigned vid32 = 300; unsigned char tmp[2]; *((unsigned short *)tmp) = vid32; printf("%x %x\n", tmp[0], tmp[1]); return 0; }
결과
2c 1
말씀해 주신 내용을 보니 이제야 이해가 갑니다.
설명이 좀 애매한데요.. 아마.. 입력 - 300 출력 - 01 2C 인데, 출력이 output[2][2]={{0x30,0x31}, {0x32, 0x43}}; 이렇게 저장되는 걸 원하시는 것 같습니다.
1. 입력이 스트링이라면, string --> (ascii -->) numeric number 로 변환합니다. 2. 1번의 결과를 sprintf 등의 버퍼 출력함수를 이용해 버퍼에 넣으시면 됩니다.
텍스트 포맷에 대한 자세한 정보
<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]
C언어를 기준으로,
C언어를 기준으로, 숫자형은 형이라고 한다면
대개의 경우 2진수입니다. C코드에서 100이라고 써도 실제로 컴파일되서 기계가 다룰때는 2진수로 다룬다는거죠.
따라서 그 4바이트형이 자료를 어떻게 가지고 있나, 보면
x86등의 little-endian의 경우 (16진수로 1바이트씩 보면)
가 됩니다.
char[2] 를 short로 캐스팅해서 거기다 대입하고,
printf에서 %c 로 찍어주면 원하는 결과가 나오겠지요.
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
답변 감사합니다.. 그런데.. 이해가 잘 안되서요.
uint32_t vid32 = 300;
unsigned char tmp[2];
for (int i = 0, j=0; i < 4 ; i++,j++)
{
printf("%x\n",(unsigned char)((vid32>> (4-i)*8) & 0xFF));
}
위와 같이 하면, 2c 00 00 01 이 되네요.
위와 같은 상황에서 tmp[2] 에 입력 가능한 코드를 받아볼수 있을까요..
아래는 제가 작성한 소스인데. 일단 각 바이트에 1과 2c 는 들어가는것으로 보입니다.
맞는것인지요..
unsigned char low = (unsigned char)((vid32>>8) & 0xFF);
unsigned char hi = (unsigned char)((vid32>>32) & 0xFF);
low = 1
hi = 2c
위 쓰신 코드는
위 쓰신 코드는 잘못된 부분이 하나 있습니다. i가 0인경우, vid32>>32 를 계산하게 되지요.
K&R에 따르면, >> 연산에서 오른쪽 인자는 0보다 크거나 같고, 해당 자료형의 비트수보다 작아야합니다.
같거나 크면, 그 연산 결과는 정의되어있지 않음(undefined)입니다.
따라서, 결과를 보고 싶다면 다음과 같이 고쳐야 합니다.
결과는
가 되죠.
그렇다면 char a[2]; 에는 어떻게 넣을것인가..
결과
가 됩니다. 물론 big endian에서는 결과가 반대로 1 2c로 나타날 것입니다.
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
정말 감사합니다..
말씀해 주신 내용을 보니 이제야 이해가 갑니다.
문제가...
설명이 좀 애매한데요..
아마..
입력 - 300
출력 - 01 2C
인데, 출력이 output[2][2]={{0x30,0x31}, {0x32, 0x43}};
이렇게 저장되는 걸 원하시는 것 같습니다.
1. 입력이 스트링이라면, string --> (ascii -->) numeric number 로 변환합니다.
2. 1번의 결과를 sprintf 등의 버퍼 출력함수를 이용해 버퍼에 넣으시면 됩니다.
댓글 달기