programing

바이트 버퍼를 서명해야 합니까, 아니면 서명되지 않은 문자 버퍼로 해야 합니까?

javaba 2022. 8. 13. 16:54
반응형

바이트 버퍼를 서명해야 합니까, 아니면 서명되지 않은 문자 버퍼로 해야 합니까?

바이트 버퍼는 부호 있는 char 또는 부호 없는 char 또는 단순히 char 버퍼 중 어느 것으로 해야 합니까?C와 C++의 차이는?

고마워요.

바이트 버퍼는 부호 있는 char 또는 부호 없는 char 또는 단순히 char 버퍼 중 어느 것으로 해야 합니까?C와 C++의 차이는?

언어 처리 방법의 작은 차이입니다.관습에 따른 큰 차이입니다.

  • char= ASCII(또는 UTF-8, 그러나 서명에 방해가 됨) 텍스트 데이터
  • unsigned char= 바이트
  • signed char= 거의 사용되지 않음

그리고 그러한 구별에 의존하는 코드가 있습니다.불과 1~2주 전에 JPEG 데이터가 에 전달되는 동안 오류가 발생했습니다.char*Base64 인코딩 함수의 버전 - "helpely"가 "string"의 비활성 UTF-8을 모두 대체했습니다.로의 변경BYTE아카unsigned char그걸 고치는 데 필요한 전부였어요

임의의 바이너리 데이터를 저장하려면unsigned charC 표준에서 패딩 비트가 없음을 보증하는 유일한 데이터 유형입니다.다른 데이터 유형은 개체 표현에 패딩 비트를 포함할 수 있습니다(즉, 값을 결정하는 비트뿐만 아니라 개체의 모든 비트를 포함합니다).패딩 비트의 상태는 지정되지 않았으며 값을 저장하는 데 사용되지 않습니다.그래서 당신이 다음을 사용하여 읽는다면char어떤 바이너리 데이터, 사물은 (값 비트만을 해석함으로써) char의 값 범위로 줄어들지만, 무시당하지만 여전히 존재하고 읽히는 비트가 있을 수 있습니다.memcpy실제 구조 객체의 비트를 채우는 것과 비슷합니다.유형unsigned char에는 이러한 내용이 포함되지 않음을 보증합니다.그 뒤를 잇다5.2.4.2.1/2(C99 TC2, n1124 여기):

char 타입의 오브젝트 값이 식에서 사용되는 경우 부호 있는 정수로 처리되는 경우,CHAR_MIN와 같아야 한다SCHAR_MIN그리고 의 가치CHAR_MAX와 같아야 한다SCHAR_MAX그렇지 않은 경우,CHAR_MIN0이어야 하며 값은CHAR_MAX와 같아야 한다UCHAR_MAX같은 값이어야 한다.

마지막 문장에서 패딩 비트를 위한 공간이 남아 있지 않음을 알 수 있습니다.사용하시는 경우char버퍼 타입으로서 오버플로우 문제도 있습니다.의 범위에 있는 하나의 요소에 명시적으로 값을 할당하는 것8bits - 따라서 이러한 할당은 정상이라고 예상할 수 있지만, bits의 범위 내에는 없습니다.char,어느 것이CHAR_MIN..CHAR_MAX이러한 변환은 오버플로우되어 신호의 발생을 포함한 구현 정의 결과가 됩니다.

실제 실장에서는 위와 같은 문제가 발생하지 않는 경우에도(실장 품질이 매우 저하될 수 있음), 처음부터 적절한 타입을 사용하는 것이 가장 좋습니다.unsigned char.

단, 문자열의 경우 데이터 유형은 다음과 같습니다.char문자열 및 인쇄 기능으로 이해할 수 있습니다.사용.signed char잘못된 결정인 것 같아요

자세한 내용은 C Standard의 다음 버전에 대한 수정이 포함되어 있는 것을 읽어 주십시오.이 수정은, 최종적으로 필요하게 됩니다.signed char패딩 비트도 없어요.그것은 이미 작업 서류에 포함되어 있다.

char 또는 부호 없는 char를 사용해야 하지만 signed char는 사용하지 마십시오.이 규격은 3.9/2에서 다음을 포함한다.

POD 타입 T의 오브젝트(베이스 클래스 서브 오브젝트 제외)에 대해서는 오브젝트가 타입 T의 유효한 값을 보유하고 있는지 여부에 관계없이 오브젝트를 구성하는 기본 바이트(1.7)를 char 또는 unsigned char 배열로 복사할 수 있다.문자 또는 부호 없는 문자 배열의 내용이 오브젝트에 다시 복사될 경우 오브젝트는 그 후에 원래의 가치를 유지한다.

typedef char byte;

이것으로 어레이를bytes. 무엇을 의미했는지는 누구나 알 수 있으며, 기능을 잃지 않습니다.

좀 바보같다는 건 알지만 의도한 대로 코드를 100% 읽을 수 있게 해 줍니다.

부호 없는 문자로 정의하는 것이 좋습니다.Infact Win32 타입 BYTE는 부호 없는 문자로 정의됩니다.이것과 C++의 차이는 없습니다.

사정에 따라 다르겠지.

버퍼가 텍스트를 유지하는 것을 의도하고 있는 경우 버퍼를 다음과 같은 배열로 선언하는 것이 타당할 수 있습니다.char디폴트로 서명되어 있는지 서명되어 있지 않은지 플랫폼이 결정합니다.이를 통해 구현 런타임 라이브러리에서 데이터를 주고받는 데 가장 문제가 적습니다.

버퍼가 바이너리 데이터를 보관하는 경우 버퍼를 사용하는 방법에 따라 달라집니다.예를 들어, 바이너리 데이터가 실제로 8비트 고정 소수점 ADC 측정으로 서명된 데이터 샘플의 팩 배열인 경우,signed char그게 제일 좋을 것 같아요.

대부분의 현실에서 버퍼는 버퍼일 뿐이며, 벌크 조작으로 버퍼를 채웠기 때문에 개별 바이트의 종류에 대해서는 별로 관심이 없습니다.또한 복잡한 데이터 구조를 해석하고 유용한 작업을 하기 위해 버퍼를 파서로 넘겨주려고 합니다.그런 경우에는 가장 간단한 방법으로 선언하십시오.

만약 그것이 실제로 8비트 바이트의 버퍼라면, 머신의 디폴트 로케일의 문자열이 아니라,uint8_t. 문자가 바이트(또는 옥텟 바이트)가 아닌 기계가 많이 있는 것은 아니지만, "this is string"이 아니라 "this is a buffer of octets"라는 문구를 작성하는 것이 많은 경우 도움이 됩니다.

휴대성을 최대화하기 위해 항상 부호 없는 문자를 사용합니다.이것이 적용될 수 있는 몇 가지 사례가 있습니다.다른 엔디안 유형의 시스템 간에 공유되는 시리얼화된 데이터가 즉시 떠오릅니다.시프트 또는 비트 마스킹을 수행할 때 이 값은 다른 값입니다.

int8_t와 uint8_t의 선택은 ptr을 NULL로 비교할 때와 비슷합니다.


기능적 관점에서 NULL은 0의 #define이므로 NULL과 비교하는 것은 0과 같습니다.

그러나 개인적으로 코딩 스타일의 관점에서, 나는 내 포인터를 NULL과 비교하기로 선택했습니다. 왜냐하면 NULL #define은 당신이 잘못된 포인터를 체크하고 있는 코드를 유지하고 있는 사람을 의미하기 때문입니다.

다른 사용자가 0과 비교한 경우 특정 값을 확인 중임을 나타냅니다.


위와 같은 이유로 uint8_t를 사용하고 싶습니다.

요소를 더 넓은 변수로 가져오면 당연히 해당 요소가 확장되거나 확장되지 않습니다.

해야 할 것과 해야 할 것...나는 서명하지 않은 것을 선호하는 경향이 있다. 왜냐하면 "원래"라고 말하는 것이 덜 매력적이기 때문이다. "야, 그건 그냥 작은 것들이다."ints데이터의 바이너리함을 강조하고 싶은 경우.

내가 지금까지 명료한 표현을 써본 적이 없는 것 같아signed char바이트 버퍼를 나타냅니다.

물론 3번째 옵션은 버퍼를 다음과 같이 표현하는 것입니다.void *할 수 있는 한 많이.많은 일반적인 I/O 기능은void *따라서 사용할 정수 타입의 결정이 완전히 캡슐화될 수 있습니다.이것은 매우 좋은 일입니다.

몇 년 전 128 이상의 ASCII 값을 가진 컬러 문자를 출력하는 C++ 콘솔 어플리케이션에 문제가 있어 char에서 unsigned char로 전환하여 해결했지만 char type을 유지하면서 해결했다고 생각합니다.

현재 대부분의 C/C++ 함수는 char를 사용하고 있으며, 양쪽 언어를 잘 이해하고 있기 때문에 char를 사용하는 경우가 많습니다.

정말 신경 쓰세요?그렇지 않은 경우 기본 문자(char)를 사용하고 중요하지 않은 문제로 코드를 복잡하게 만들지 마십시오.그렇지 않으면 미래의 유지관리자는 서명된(또는 서명되지 않은) 이유를 궁금해하게 됩니다.그들의 삶을 단순하게 만들어라.

컴파일러에게 거짓말을 하면 벌을 받을 것이다.

버퍼에 방금 통과된 데이터가 포함되어 있고 사용자가 어떤 방식으로도 데이터를 조작하지 않을 경우 문제가 되지 않습니다.

다만, 버퍼의 내용을 조작할 필요가 있는 경우는, 올바른 타입의 선언을 실시하면, 코드가 심플해집니다."int val = buf[i] & 0xff;" 헛소리는 없습니다.

데이터가 실제로 무엇이고 어떻게 활용해야 하는지 생각해 보십시오.

언급URL : https://stackoverflow.com/questions/653336/should-a-buffer-of-bytes-be-signed-or-unsigned-char-buffer

반응형