2012. 6. 2. 12:33 devel
4bytes data type pointer에서 1byte 씩 접근하기
제목을 잘 못 짓겠네요
어떤 함수가 있는데
argument가 uint32_t 였심
그런데 문제가 이 함수랑 연동해서 사용해야하는 read나 write는 byte단위로 움직임
uint32_t는 4byte인데 read/write는 1byte씩 사용하는 함수니 뭔가를 해야함
#include <stdint.h>
uint32_t u32;
uint8_t chr[2]={'a', 'c'};
memset(u32, 0, sizeof(u32));
strncpy(u32, chr, 2);
이런식으로 무식하게 사용해볼까 라고 생각도 했지만
strncpy가 그 넓고 넓은 uint32_t의 어디에 복사해 넣을지를 몰라서 못 사용함
여튼...
32bit data type 의 pointer를 가지고 8bit data type만큼 돌아댕길 일이 있었음
FILE STRUCTURE
A B C D 1 2 3 4
MEM STRUCTURE(after read() called)
&mod_data[0], &mod_data[1]
[ ][ ][ ][ ], [ ][ ][ ][ ]
D C B A 4 3 2 1
mod_data는 uint32_t
그러면 B에 직접 접근하고 싶다
-> 혹시나 해서 찾아보니까 맞는듯
(http://jongampark.wordpress.com/2010/08/27/bit-field%EC%99%80-endian-byte-ordering/)
80 , (raw_data[0]& 0xFF)
81 , (raw_data[0]& (0xFF<<8) ) >>8
82 , (raw_data[0]& (0xFF<<0x10)) >>0x10
83 , (raw_data[0]& (0xFF<<0x18)) >>0x18
84 , (raw_data[1]& 0xFF)
85 , (raw_data[1]& (0xFF<<8) ) >>8
86 , (raw_data[1]& (0xFF<<0x10)) >>0x10
87 , (raw_data[1]& (0xFF<<0x18)) >>0x18
이런식으로 shift시켜서 빼는거 말고
어떻게 해야할까?
1. uint8_t*로 type casting
2. uint8_t* offset = (uint8_t*) u32;
8 uint8_t* offset;
9 uint32_t data[2];
10
11 offset = (uint8_t*) data;
12 offset[0] = 'a';
13 offset[1] = 'b';
14 offset[2] = 'c';
15 offset[3] = NULL;
16
17
18 printf("%c,%c,%c\n%s\n", offset[0], *(((uint8_t*) data)+1), ((uint8_t*) data)[2], data);
그러하다
궂이 쉬프팅 시키지 않아도 된다
121 write(write_fd, &((uint8_t*) &mod_data[0])[0], 1);
122 write(write_fd, &((uint8_t*) &mod_data[0])[1], 1);
123 write(write_fd, &((uint8_t*) &mod_data[0])[2], 1);
124 write(write_fd, &((uint8_t*) &mod_data[0])[3], 1);
125
126 write(write_fd, &((uint8_t*) &mod_data[1])[0], 1);
127 write(write_fd, &((uint8_t*) &mod_data[1])[1], 1);
128 write(write_fd, &((uint8_t*) &mod_data[1])[2], 1);
129 write(write_fd, &((uint8_t*) &mod_data[1])[3], 1);
'devel' 카테고리의 다른 글
gcc 개인적인 정리 (0) | 2012.04.23 |
---|---|
Sprintf part1 (0) | 2008.11.29 |