programing

int를 4바이트 문자 배열로 변환(C)

itsource 2022. 7. 2. 23:31
반응형

int를 4바이트 문자 배열로 변환(C)

사용자가 입력한 int를 문자 배열에 할당하는 4바이트로 변환하려고 합니다.이것이 어떻게 행해지는가?

예제:

175의 사용자 입력을

00000000 00000000 00000000 10101111


모든 하면 255가 .0 0 0 ff.0 0 0 ffffffff

unsigned int value = 255;   

buffer[0] = (value >> 24) & 0xFF;
buffer[1] = (value >> 16) & 0xFF;
buffer[2] = (value >> 8) & 0xFF;
buffer[3] = value & 0xFF;

union {
    unsigned int integer;
    unsigned char byte[4];
} temp32bitint;

temp32bitint.integer = value;
buffer[8] = temp32bitint.byte[3];
buffer[9] = temp32bitint.byte[2];
buffer[10] = temp32bitint.byte[1];
buffer[11] = temp32bitint.byte[0];

다 생기다0 0 0 ffffffff0 0 0 ff

들 수 . 175를 들 수 .입력 출력은 다음과 같습니다.0, 0, 0, ffffffaf 꼭 when just just just로 할 때0, 0, 0, af

작업을 수행하는 휴대용 방법(고객이 사용할 수 있도록 보장)0x00 0x00 0x00 0xaf'는 '어디서나를 입니다.

unsigned char bytes[4];
unsigned long n = 175;

bytes[0] = (n >> 24) & 0xFF;
bytes[1] = (n >> 16) & 0xFF;
bytes[2] = (n >> 8) & 0xFF;
bytes[3] = n & 0xFF;

과 【니언】를 memcpy() 수 .


문제가 되고 있는 것은 변환이 아니라 인쇄에 관한 것입니다.요.charunsigned char하다

printf("%x %x %x %x\n", bytes[0], bytes[1], bytes[2], bytes[3]);

이 있는 intprintf로합니다.int (오류)unsigned int if, if, if, if.int원래 유형의 모든 값을 유지할 수 없습니다). ifchar, 「서명」이 됩니다.0xff 타입의 않을 이 높기 이 -1로 있습니다).0xff(2s-컴퓨팅 머신) 을 사용합니다.

은 -1로 됩니다.int 라고합니다.0xffffffffint기계 위에 올려놓으면 이렇게 보일 겁니다.

중 하나를 사용하는 입니다.unsigned char, 「」에 합니다.unsigned char printf★★★★★★★★

printf("%x %x %x %x\n", (unsigned char)bytes[0],
                        (unsigned char)bytes[1],
                        (unsigned char)bytes[2],
                        (unsigned char)bytes[3]);

32비트 int의 개별 바이트 주소를 지정하시겠습니까?가능한 방법 중 하나는 결합입니다.

union
{
    unsigned int integer;
    unsigned char byte[4];
} foo;

int main()
{
    foo.integer = 123456789;
    printf("%u %u %u %u\n", foo.byte[3], foo.byte[2], foo.byte[1], foo.byte[0]);
}

주의: 부호 없는 값을 반영하도록 printf를 수정했습니다.

사용하시면 .memcpy음음음같 뭇매하다

unsigned int value = 255;
char bytes[4] = {0, 0, 0, 0};
memcpy(bytes, &value, 4);

사용자 를 "175"로 .00000000 00000000 00000000 10101111엔디언 바이트 순서입니다.네트워크 바이트 순서라고도 불립니다.

를 빅 문자 C의 없는 문자 배열 175를 입니다.htonl()(헤더함수)에.<arpa/inet.h>순서로 int big endian을 사용합니다.memcpy()되어 있습니다).<string.h>、 C , 、<cstring>C++)를 사용하여 바이트를 char(또는 부호 없는 char) 배열에 복사합니다.

함수는 부호 없는 32비트 정수를 인수로 받아들입니다(대조).htons()부호 없는 16비트 정수를 받아들여 호스트 바이트 순서에서 네트워크 바이트 순서로 변환합니다(따라서 약어: Host to Network Long, 대 Host to Network Short:htons)는 부호 없는 32비트 정수로 결과를 반환합니다.이 기능 패밀리의 목적은 모든 네트워크 통신이 빅 엔디안 바이트 순서로 이루어지도록 하는 것입니다.이것에 의해, 모든 머신이 소켓을 개입시켜 바이트 순서의 문제 없이 서로 통신할 수 있게 됩니다.(한편으로는 빅엔디안 머신의 경우,htonl(),htons(),ntohl() ★★★★★★★★★★★★★★★★★」ntohs()노옵이는 바이트가 이미 올바른 바이트 순서이기 때문에 소켓에서 송수신되기 전에 플립할 필요가 없기 때문입니다.)

코드는 다음과 같습니다.

#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>

int main() {
    unsigned int number = 175;

    unsigned int number2 = htonl(number);
    char numberStr[4];
    memcpy(numberStr, &number2, 4);

    printf("%x %x %x %x\n", numberStr[0], numberStr[1], numberStr[2], numberStr[3]);

    return 0;
}

카페가 말했듯이 printf를 사용하여 문자를 부호 없는 문자로 인쇄해야 합니다.%x포맷 지정자.

위의 코드가 출력됩니다.0 0 0 aflittle ordering을 175 endian byte ordering 사 、 175의 16진수입니다.

다음 작업을 수행할 수 있습니다.

void CopyInt(int value, char* buffer) {
  memcpy(buffer, (void*)value, sizeof(int));
}
int a = 1;
char * c = (char*)(&a); //In C++ should be intermediate cst to void*

변환의 문제(마지막에 ffffff를 주는 이유)는 (&binary 연산자를 사용하는) 16진수 정수가 서명된 것으로 해석되기 때문입니다.부호 없는 정수로 던지면 괜찮을 거야

int uint32_t ★★★★★★★★★★★★★★★★★」char로로 합니다.uint8_t.

클라이언트와 서버의 통신을 해결하고, 실제 시간(4바이트, Unix epoch로 포맷)을 1비트 어레이로 송신한 후, 다른 쪽에서 재구축한 방법에 대해 설명합니다.(주의: 프로토콜은 1024바이트를 전송하도록 되어 있습니다.

  • 클라이언트 측

    uint8_t message[1024];
    uint32_t t = time(NULL);
    
    uint8_t watch[4] = { t & 255, (t >> 8) & 255, (t >> 16) & 255, (t >> 
    24) & 255 };
    
    message[0] = watch[0];
    message[1] = watch[1];
    message[2] = watch[2];
    message[3] = watch[3];
    send(socket, message, 1024, 0);
    
  • 서버측

    uint8_t res[1024];
    uint32_t date;
    
    recv(socket, res, 1024, 0);
    
    date = res[0] + (res[1] << 8) + (res[2] << 16) + (res[3] << 24);
    
    printf("Received message from client %d sent at %d\n", socket, date);
    

도움이 됐으면 좋겠다.

이 문제는 부호 없는 문자가 많은 사람이 생각하는 1바이트 숫자가 아닌 4바이트 숫자이기 때문에 로 변경합니다.

union {
unsigned int integer;
char byte[4];
} temp32bitint;

인쇄 중에 주조하여 'int'로 승격하지 않도록 합니다(기본적으로 C는 그렇게 합니다).

printf("%u, %u \n", (unsigned char)Buffer[0], (unsigned char)Buffer[1]);

C++에서는 중간 캐스팅에서 무효*가 필요한 이유는 cpp는 포인터 간의 직접 변환을 허용하지 않기 때문에 refret_cast 또는 casting to void*를 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/3784263/converting-an-int-into-a-4-byte-char-array-c

반응형