[완료]Big Endian 방식의 data인식을 Little Endian 방식으로 인식하게 하는법 관련

neobug의 이미지

#설명#
example라는 512바이트의 binary data를 읽어 들여와서 buf1과 buf2에 저장 합니다.
example의 HEX data를 먼저 출려하고 그중 특정부위(buf1기준 56번 배열부터 59번까지)
(buf2기준 14번 배열)의 data를(총32bit)를 DEC 로 출력 하는 프로그램 입니다.

#질문#
이 프로그램은 보시다시피 Big Endian 방식으로 HEX를 읽어 들여와 DEC으로 출력을 합니다.
저는 Little Endian 방식으로 HEX를 읽어 DEX로 표현 하고 싶습니다.
예를들면, 0x00001000 은 4096이 아닌 1048576으로 출력되게 말입니다.

제가 예상하는 방법은 아래 2가지 입니다.
1.buf1의 값을 이용하는 방법
buf1[56], buf1[57], buf1[58], buf1[59] 의 char 데이터를 역순으로 32bit 크기의
변수에 알맞게 할당 그 변수를 decimal로 표현 하는 방법
(문제: buf2처럼 32bit에 값이 전부 들어가게 하는 방법)

2.buf2의 값을 이용하는 방법
buf2의 값을 long type의 변수로 type전환, 전환된 변수를 순환shift 시켜서 값을 조정 출력
(문제: C의 shift연산자(<<)는 순환 시프트가 아니다)

3.함수가 있다?

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
 
union unspan {
        long ulong;
        unsigned char uchar[4];
} trans;
 
int main()
{
        int fd1, fd2, nread1, nread2;
        unsigned short int count;
 
        unsigned char buf1[512];
        char* buf2[128];
 
        if((fd1 = open("example", O_RDONLY)) == -1) {
                perror("Cannot open the file");
                exit(-1);
        }
        if((fd2 = open("example", O_RDONLY)) == -1) {
                perror("Cannot open the file");
                exit(-1);
        }
 
        if((nread1 = read(fd1, buf1, 512)) < 512) {
                perror("Not enough header data");
                exit(-1);
        }
        if((nread2 = read(fd2, buf2, 128)) < 128) {
                perror("Not enough header data");
                exit(-1);
        }
 
        for(count=0; count < nread1; count++) {
                printf("%02X ", buf1[count]);
        }
 
        puts("\n\n[Minimum Size(ver.512)]");
 
        trans.ulong = (long)buf2[14];
        for(count=0; count < 4; count++) {
                printf("%02X ", trans.uchar[count]);
        }
        printf("\t(This value is %d)\n", trans.ulong);
 
        puts("\n\n[Minimum Size(ver.128)]");
 
        for(count=0; count < 4; count++)
                printf("%02X ", buf1[count+56]);
 
        printf("\t(This value is %d)\n", buf2[14]);
}

아래는 출력 값입니다
D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 03 00 FE FF 09 00 06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 0C 00 00 00 02 00 00 00 00 00 10 00 0F 00 00 00 01 00 00 00 FE FF FF FF 00 00 00 00 0D 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

[Minimum Size(ver.512)]
00 00 10 00 (This value is 4096)

[Minimum Size(ver.128)]
00 00 10 00 (This value is 4096)

haze11의 이미지

3. htons, htonl, ntons, ntonl

neobug의 이미지

위 함수들은 cpu architecture에 의존적인 부분이 있더군요.
예를 들어,
sparc은 Host byte order도 Big Endian
Network byte order도 Big Endian이여서
한수를 사용해도 그 순서가 역순으로 바뀌지 않습니다.

단순히 Byte Order를 바꿔주는 함수는 없는지 궁굼합니다ㅎ.

댓글 달기

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