#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
uint32_t my_htons(uint32_t value) {
return ((value & 0xFF) << 24) | ((value & 0xFF00) << 8) | ((value >> 8) & 0xFF00) | ((value >> 24) & 0xFF);
}
//예를 들어 처음 4byte가 01 02 03 04라는 파일이 있다고 해보자
//그럼 2진수로 0000 0001 0000 0010 0000 0011 0000 0100 이 된다.
//처음 (value & 0xFF) << 24 의 과정이다. FF는 1111 1111이다. 처음 바이트인 0000 0100과 and 연산을 하게 되면 똑같은 0000 0100이 나온다
//그것을 24비트 밀어준다. 즉 원래 01 이 있어야 하는 자리에 04를 두는 것이다.
//(value & 0xFF00) << 8 의 경우도 원래 02가 있어야 하는 자리에 03을 두는 것이다.
// (value >> 8) & 0xFF00 의 경우는 살짝 다르다. 먼저 비트를 오른쪽으로 밀어서 04를 지운다음 01 02 03 만 있는 곳에서 FF00과의 연산으로 02를 03이 있어야 할 곳으로 둔다.
// (value >> 24) & 0xFF 의 경우도 01을 04가 있던 위치에 둔다.
// 그냥 htons를 쓰자
int main(int argc, char *argv[]) {
uint32_t buf;
FILE *fp1 = fopen(argv[1], "rb");
size_t bytesRead = fread(&buf, sizeof(unsigned char), 4, fp1);
//fread는 파일 스트림에서 원하는 바이트 만큼 원하는 횟수만큼 읽어 버퍼에 저장한다.
//fread(저장할 버퍼의 주소,읽을 바이트수,읽을 횟수,읽을 파일)
//즉 fread(&buf, sizeof(unsigned char), 4, fp1); 는 fp1을 읽을 건데 저장할 버퍼는 buf고 1바이트 만큼 4번 읽을 것이다 이라는뜻이다 .
fclose(fp1);
uint32_t change = my_htons(buf);
FILE *fp2 = fopen(argv[2], "wb");
fwrite(&change, sizeof(uint32_t), 1, fp2);
//fwrite도 fread랑 같다고 보면 된다. 얘는 쓸려고 파일을 여는 것이다.
//fwrie(쓰고싶은 데이터가 저장된 메모리의 시작 주소, 쓰고 싶은 데이터의 단위 크기, 반복 횟수, 쓸 파일)
//즉 fwrite(&change, sizeof(uint32_t), 1, fp2); 는 change라는 데이터를 uint32_t만큼 1번 쓸건데 fp2에 쓸거다 라는 뜻이다.
fclose(fp2);
printf("the END\n");
return 0;
}
아주 친절한 주석이지만 이해 하기 쉽게 이미지를 추가 해서 myhtons 함수를 설명하겠다.
1.(value & 0xFF) << 24
2. (value & 0xFF00) << 8
3. (value >> 8) & 0xFF00
4. (value >> 24) & 0xFF
이제 모든 것을 or 연산 하면 Hex로 바뀌었을때 04 03 02 01이 된다.
'Programming > C language' 카테고리의 다른 글
Network Programming [3.ARP packet capture & spooping] (0) | 2023.11.01 |
---|---|
Network Programming [1.PCAP and PCAP] (0) | 2023.10.05 |
malloc , Calloc , realloc , free (0) | 2023.09.03 |
C언어[6] (0) | 2022.07.11 |
C언어[6] (0) | 2022.07.03 |