๐ ๊ณผ์ ๋ด์ฉ
๐งฉ ์ฝ๋ ๊ตฌ์ฑ ์ค๋ช
- BigtoLittle() : ๋น ์๋์ธ์์ ๋ฆฌํ ์๋์ธ์ผ๋ก ๋ณํํ๋ ํจ์
- main() :
- ์ ๋ ฅ ํ์ผ๊ณผ ์ถ๋ ฅ ํ์ผ์ ์ด๋ฆ์ ์ธ์๋ก ๋ฐ๋๋ค.
- ์ ๋ ฅ ํ์ผ์ ๋ฐ์ด๋๋ฆฌ๋ก ์ฝ์ด FILE ํ ๋ณ์์ ์ ์ฅํ๋ค.
- 4๋ฐ์ดํธ๋ง ์ฝ์ด unint32_t ํ ๋ณ์์ ์ ์ฅํ๋ค.
- BigtoLittle() ํจ์๋ฅผ ํธ์ถํด ๋ณํ ํด์ค๋ค.
- ๋ณํํด์ค ๊ฐ์ ์ถ๋ ฅ ํ์ผ์ "์ฐ๊ธฐ" ํด์ค๋ค.
๐ฅ๏ธ ์ฝ๋ & ์ค๋ช
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
// ๋น
์๋์ธ์์ ๋ฆฌํ์๋์ธ์ผ๋ก ๋ณํํ๋ ํจ์
int BigtoLittle(uint32_t buf) {
uint32_t result;
// ๋นํธ์ฐ์ฐ์ ์ด์ฉํด ๋ณํ
result = (buf >> 24) | ((buf >> 8 ) & 0x0000FF00) | ((buf << 8) & 0x00FF0000) | (buf << 24);
return result;
}
int main(int argc, char *argv[]) {
// ์
๋ ฅ ํ์ผ, ์ถ๋ ฅ ํ์ผ ๋ชจ๋ ์ฝ์ด์ผ ํ๋ฏ๋ก ์ธ์๊ฐ ์ ๋๋ก ๋ฐ์์ง์ง ์๋๋ค๋ฉด ๋ค์์ ์ถ๋ ฅ
if (argc != 3) {
printf("Usage: %s <์
๋ ฅ ํ์ผ> <์ถ๋ ฅ ํ์ผ>\n", argv[0]);
}
// ํ์ผ์ ๋ฐ์ด๋๋ฆฌ๋ก ์ฝ์ด in_f ์์น์ ์ ์ฅ
FILE *in_f = fopen(argv[1], "rb");
// ์ผ์นํ๋ ํ์ผ์ด ์๋ ๊ฒฝ์ฐ
if (in_f == NULL ) {
printf("์ผ์นํ๋ ํ์ผ์ด ์์ต๋๋ค");}
// 4๋ฐ์ดํธ ํฌ๊ธฐ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ฃ์ด์ค ๋ณ์ ์ ์ธ
uint32_t buffer;
// fread()ํจ์๋ฅผ ์ด์ฉํด ํ์ผ๋ก๋ถํฐ ์ง์ ํ ํฌ๊ธฐ ๋งํผ ์๋ฃ๋ฅผ ์ฝ์ด๋ค์ฌ ์ ์ฅ
fread(&buffer, 4, 1, in_f); // fread(์ฝ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ํฌ์ธํฐ, ์ฝ์ ํฌ๊ธฐ, ์ฝ์ ๊ฐ์, ์ฝ์ ํ์ผ)
fclose(in_f); // ํ์ผ ๋ซ๊ธฐ
// ๋น
์๋์ธ์์ ๋ฆฌํ์๋์ธ์ผ๋ก ๋ฐ๊พธ๋ ํจ์ ํธ์ถ
buffer = BigtoLittle(buffer);
FILE *out_f = fopen(argv[2], "wb"); // ์ถ๋ ฅ ํ์ผ ํฌ์ธํฐ ์ ์ธ
fwrite(&buffer, 4, 1, out_f); // ์ถ๋ ฅ ํ์ผ์ ์ฐ๊ธฐ
fclose(out_f); // ํ์ผ ๋ซ๊ธฐ
}
๐ BigtoLittle() ์ ๋ํ ์๊ณ ๋ฆฌ์ฆ ์ค๋ช !
์ผ์ชฝ์ ๋ณด์ด๋ 0x12345678 ์ด๋ผ๋ ๋ฐ์ดํฐ๋ฅผ 0x78563412๋ก ๋ฐ๊พธ์ด์ผ ํ๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ํํธ ์ฐ์ฐ( >>, << )๊ณผ and( & ), or( | ) ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ๋ฐ๊ฟ ๊ฒ์ด๋ค.
๋ฐ๊พธ๊ธฐ ์ํด์๋ ์์ ์ด๋ฏธ์ง์ ๋นจ๊ฐ์ ์ซ์๋ค์ ์์น๋ฅผ ์ฎ๊ฒจ์ฃผ๊ณ , or ์ฐ์ฐ์ ํตํด ํ๋๋ก ํฉ์ณ ์ฃผ์ด์ผ ํ๋ค.
0x00000012์ 0x78000000์ ์๋์ผ๋ก ์ํํธ ์ฐ์ฐ๋ง ํด์ฃผ๋ฉด ๊น๋ํ๊ฒ ์ฎ๊ฒจ์ง๋ ๊ฒ์ ์ ์ ์๋ค.
ํ์ง๋ง 0x00003400๊ณผ 0x00560000์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
0x00003400๊ณผ 0x00560000์ฒ๋ผ ์ฎ๊ฒจ์ง ์ซ์๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ 0์ด ๋์ด์ผ ํ๋๋ฐ,
๋ถํ์ํ ์ซ์๋ค์ด ์ฑ์์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ and ์ฐ์ฐ์ ํตํด ํด๊ฒฐํ ์ ์๋ค.
and ์ฐ์ฐ์ ๋ ๋ค 1์ด๋ฉด 1์ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ ๋ฐํํ๋ ์ฐ์ฐ์์ด๋ค.
์ด๋ฌํ ์ ์ ์ด์ฉํด ๋ค์๊ณผ ๊ฐ์ ์ฐ์ฐ์ ํตํด ํด๊ฒฐํ ์ ์๋ค.
๋นจ๊ฐ ์ซ์๊ฐ ์๋ ์๋ฆฌ๋ง ๋ชจ๋ 1๋ก ์ฑ์ด ๊ฐ๊ณผ ์ฐ์ฐ์ ํด์ค์ผ๋ก์จ ํ์์๋ ์ซ์๋ค์ ์์ ์ค๋ค.
๋ฐ๋ผ์ ๊ตฌํ๊ณ ์ํ ๊ฐ์ ๋ง๋ค์ด๋๋ค.
์ด๋ ๊ฒ ๊ตฌํด๋ธ ๊ฐ๋ค์ ๊ฐ์ง๊ณ ๋ชจ๋ or ์ฐ์ฐ์ ํ๋ฉด ์ต์ข ์ ์ผ๋ก 0x78563412์ ๊ฐ์ ๋ง๋ค์ด ๋ผ ์ ์๋ค.
๐๏ธ ์ถ๋ ฅ ๊ฒฐ๊ณผ
๋จผ์ gcc๋ฅผ ์ด์ฉํด ํด๋น ์ฝ๋๋ฅผ ์ปดํ์ผ ํด์ฃผ์๋ค.
gcc BigtoLittle.c -o BigtoLittle
๊ทธ ๋ค์, 0x12345678 ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๋ง๋ค์ด ์ฃผ์๋ค.
hexdump๋ก ํ์ธํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋น ์๋์ธ ํ์์ผ๋ก ์ ์ฅ์ด ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด์ ์์ฑํ ์ฝ๋๋ฅผ ์คํ์์ผ ๋ณํ์ ํด๋ณด์.
hexdump๋ก result.bin ํ์ผ์ ํ์ธํด๋ณด๋ฉด ๋น ์๋์ธ์์ ๋ฆฌํ ์๋์ธ์ผ๋ก ๋ณํ๋์ด ์ ์ฅ์ด ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
'Programming Language > C' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C์ธ์ด] ๋ฐฑ์ค 10810๋ฒ : ๊ณต ๋ฃ๊ธฐ (1) | 2023.09.14 |
---|---|
[C์ธ์ด] ๋ฐฑ์ค 2562๋ฒ : ์ต๋๊ฐ (0) | 2023.09.14 |
[C์ธ์ด] ๋์ ํ ๋น : malloc() (0) | 2023.09.12 |
[C์ธ์ด] ๋ฐฑ์ค 10818๋ฒ : ์ต์, ์ต๋ (0) | 2023.09.12 |
[C์ธ์ด] Call By Value & Call By Reference (0) | 2023.06.16 |