#define GET16(p) ((_u16) * ((_u8*)(p)+0) << 8 | (_u16) * ( (_u8*)(p)+1) )

poibe의 이미지

무슨의미인지 설명좀 부탁드립니다. ㅜㅜ

_u8과 _u16은 아래와 같이 정의 되어있습니다.

typedef unsigned char _u8;
typedef unsigned short _u16;

ㅜㅜ

espereto의 이미지

포인터 p에 저장되어 있는 16비트 big endian 데이터를 가져오는 매크로입니다.
(host가 little endian이건 big endian이건 상관없이)

대충 풀어서 쓰면...

_u8 *p1 = (_u8*)p;
_u16 p2h = (_u16) ( (*(*p1+0)) &lt;&lt; 8);
_u16 p2l = (_u16) ( *(p1+1) );
_u16 p2 = p2h | p2l;

가 되니까요.
poibe의 이미지

제가 잘 이해를 못해서 그런거 같은데요..

p ="1234"라면
big Endian이면

p + 0 = 12
p + 1 = 34이고

p + 0 8bit 쉬프트 하면
12가 00001100 이므로
00001100 00000000이 된다.

34는 00010010이므로

p + 0 | p + 1 = 00001100 00010010 이 되고,
12 34가 되는데;;

Little Endian이면
p+0 = 34 이고
p+1 = 12 이므로

p+0 8비트 쉬프트 하면
00010010 00000000 이되고

p+1 은 00000000 00001100이 되는거 아닌가요?

그럼 p+0 | p+1 = 00010010 00000000
or
00000000 00001100

00010010 00001100
34 12
빅으로 안바뀌고.. 그래도인데;;

무엇을 잘못 본건지요?? ㅜㅜ

Fly to the SKY~~~~~~

"According to your faith, be it unto you!!"

익명사용자의 이미지

허허... 왜 이러십니까?
hex code, 16 진수로 말합시다.
예를 들어서 원하는 p 위치에 0x1234가 있다면...
바이너리로는 0001 0010 0011 0100 이어야 하겠죠?
그런데 메모리에 위의 순서대로 들어가 있다고 칩시다.

여기서 위의 앞의 바이트와 뒤의 바이트를 바꾸고 싶다면?
unsigned short a = (unsigned short)(*((unsigned char *)p + 0));
unsigned short b = (unsigned short)(*((unsigned char *)p + 1));
unsigned short c = (a << 8) + b;

가 되겠습니다.

익명사용자의 이미지

unsigned short c = (a << 8) | b;

가 되겠습니다.

그래서 c에는 0x3412가 들어가 있겠죠?

poibe의 이미지

좀더 자세히점.. ㅜㅜ

Fly to the SKY~~~~~~

"According to your faith, be it unto you!!"

익명사용자의 이미지

#define GET16(p) ((_u16) * ((_u8*)(p)+0) << 8 | (_u16) * ( (_u8*)(p)+1) )

시스템(CPU 타입)들이 같은 정수값도 바이트단위 저장방식이 다릅니다.

big endian 은 2바이트 정수가 바이트열로 볼때 8의 배수로 높은 자리를 2번째 바이트로 저장합니다.
little endian 은 0xff 를 & 연산한 작은 자리를 2번째 바이트에 저장합니다.

위 매크로는 첫번째 바이트를 left shift 8 bit 해서 큰 자리로 쓰고, 두번째 바이트를 낮은 자리에 썼습니다. (little endian 방식의 숫자를 가져온 겁니다)

일반적으로 네트웍을 통해 숫자를 바이트열에 담아 던집니다.
little endian 방식의 시스템에서 생성한 숫자바이트열을 big endian 방식의 시스템에서 받아서 숫자로 변경하는 코드네요.

혹은 little endian 방식의 시스템에서 그대로 써도 동일한 결과 입니다. 숫자 자체가 아니라 정수를 바이트로 접근할때 숫자로 바꾸는 방식입니다.

첫번째 분의 답변이 거꾸로 되었네요.

poibe의 이미지

^^ 답글달아주신분들 모두 감사드립니당~~

Fly to the SKY~~~~~~

"According to your faith, be it unto you!!"

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.