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 ffffffff
0 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()
수 .
문제가 되고 있는 것은 변환이 아니라 인쇄에 관한 것입니다.요.char
unsigned char
하다
printf("%x %x %x %x\n", bytes[0], bytes[1], bytes[2], bytes[3]);
이 있는 int
printf
로합니다.int
(오류)unsigned int
if, if, if, if.int
원래 유형의 모든 값을 유지할 수 없습니다). ifchar
, 「서명」이 됩니다.0xff
타입의 않을 이 높기 이 -1로 있습니다).0xff
(2s-컴퓨팅 머신) 을 사용합니다.
은 -1로 됩니다.int
라고합니다.0xffffffff
로 int
기계 위에 올려놓으면 이렇게 보일 겁니다.
중 하나를 사용하는 입니다.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 af
little 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
'programing' 카테고리의 다른 글
Vuex 작업 및 구성 요소에서 경로 변경 (0) | 2022.07.02 |
---|---|
메모리 리크 디텍터의 동작 원리 (0) | 2022.07.02 |
C/C++의 const 어레이와 static const 어레이의 차이점은 무엇입니까? (0) | 2022.07.02 |
vuelidate에 sameAs를 사용하면 왜 작동하지 않는 거죠? (0) | 2022.07.02 |
Vue.js 2에서 소품을 초기 데이터로 전달하는 올바른 방법은 무엇입니까? (0) | 2022.07.02 |