programing

유닉스와 윈도우 모두에서 작동하는 C의 64비트 정수(uint64_t)에 해당하는 아토이는?

topblog 2023. 9. 20. 20:02
반응형

유닉스와 윈도우 모두에서 작동하는 C의 64비트 정수(uint64_t)에 해당하는 아토이는?

64비트 정수 문자열을 정수로 변환하려고 하는데 어떤 것을 사용해야 할지 모르겠습니다.

가지고 있거나 비주얼 스튜디오와 함께 사용할 수 있습니다.

unsigned long long strtoull(const char *restrict str,
       char **restrict endptr, int base);


/* I am sure MS had a good reason not to name it "strtoull" or
 * "_strtoull" at least.
 */
unsigned __int64 _strtoui64(
   const char *nptr,
   char **endptr,
   int base 
);

질문에 c 태그를 붙였으므로 C++ 솔루션에도 관심이 있을 것으로 생각합니다.이 작업은 다음을 사용하여 수행할 수 있습니다.boost::lexical_cast아니면std::istringstream부스트를 사용할 수 없는 경우:

#include <boost/lexical_cast.hpp>
#include <sstream>
#include <iostream>
#include <cstdint>
#include <string>

int main() {
  uint64_t test;
  test = boost::lexical_cast<uint64_t>("594348534879");

  // or
  std::istringstream ss("48543954385");
  if (!(ss >> test))
    std::cout << "failed" << std::endl;
}

두 가지 스타일 모두 Windows와 Linux(및 기타)에서 작동합니다.

C++11에는 다음과 같은 기능도 있습니다.std::stoull사용할 수 있는 항목:

#include <string>

int main() {
  const std::string str="594348534879";
  unsigned long long v = std::stoull(str);
}

뭔가...

#ifdef WINDOWS
  #define atoll(S) _atoi64(S)
#endif

..그럼 그냥 사용하세요.atoll(). 변경할 수도 있습니다.#ifdef WINDOWS다른 것에, 당신이 의지할 수 있는 무언가를 사용하여 그것을 나타낼 수 있습니다.atoll()빠졌지만.atoi64()(적어도 당신이 우려하는 시나리오에 대해서는) 거기에 있습니까?

해라strtoull(), 아니면strtoul(). 전자는 C99와 C++11에만 있지만, 일반적으로 널리 사용됩니다.

현대의 c++에서는 std::stoll을 사용합니다.

http://en.cppreference.com/w/cpp/string/basic_string/stol

std::stoi, std::stol, std::stoll
  C++  Strings library std::basic_string 
Defined in header <string>
int       stoi( const std::string& str, std::size_t* pos = 0, int base = 10 );
int       stoi( const std::wstring& str, std::size_t* pos = 0, int base = 10 );
(1) (since C++11)
long      stol( const std::string& str, std::size_t* pos = 0, int base = 10 );
long      stol( const std::wstring& str, std::size_t* pos = 0, int base = 10 );
(2) (since C++11)
long long stoll( const std::string& str, std::size_t* pos = 0, int base = 10 );
long long stoll( const std::wstring& str, std::size_t* pos = 0, int base = 10 );
(3) (since C++11)
Interprets a signed integer value in the string str.
1) calls std::strtol(str.c_str(), &ptr, base) or std::wcstol(str.c_str(), &ptr, base)
2) calls std::strtol(str.c_str(), &ptr, base) or std::wcstol(str.c_str(), &ptr, base)
3) calls std::strtoll(str.c_str(), &ptr, base) or std::wcstoll(str.c_str(), &ptr, base)
Discards any whitespace characters (as identified by calling isspace()) until the first non-whitespace character is found, then takes as many characters as possible to form a valid base-n (where n=base) integer number representation and converts them to an integer value. The valid integer value consists of the following parts:
(optional) plus or minus sign
(optional) prefix (0) indicating octal base (applies only when the base is 8 or ​0​)
(optional) prefix (0x or 0X) indicating hexadecimal base (applies only when the base is 16 or ​0​)
a sequence of digits
The set of valid values for base is {0,2,3,...,36}. The set of valid digits for base-2 integers is {0,1}, for base-3 integers is {0,1,2}, and so on. For bases larger than 10, valid digits include alphabetic characters, starting from Aa for base-11 integer, to Zz for base-36 integer. The case of the characters is ignored.
Additional numeric formats may be accepted by the currently installed C locale.
If the value of base is ​0​, the numeric base is auto-detected: if the prefix is 0, the base is octal, if the prefix is 0x or 0X, the base is hexadecimal, otherwise the base is decimal.
If the minus sign was part of the input sequence, the numeric value calculated from the sequence of digits is negated as if by unary minus in the result type.
If pos is not a null pointer, then a pointer ptr - internal to the conversion functions - will receive the address of the first unconverted character in str.c_str(), and the index of that character will be calculated and stored in *pos, giving the number of characters that were processed by the conversion.
Parameters
str -   the string to convert
pos -   address of an integer to store the number of characters processed
base    -   the number base
Return value
The string converted to the specified signed integer type.
Exceptions
std::invalid_argument if no conversion could be performed
std::out_of_range if the converted value would fall out of the range of the result type or if the underlying function (std::strtol or std::strtoll) sets errno to ERANGE.

strtoll(std::string도 당연히 사용하기 쉬운)과 std::stoll(얼핏 보면 std::string에 더 적합한 것처럼 보이는) 또는 boost::lexical_cast와 같은 C 스타일 함수 중에서 선택할 때: 입력 문자열을 구문 분석할 수 없거나 범위가 오버플로되는 경우 두 개의 함수가 예외를 던질 것임을 유의하십시오.때로는 유용하지만 때로는 그렇지 않을 수도 있지만, 이는 여러분이 달성하고자 하는 것에 달려 있습니다.

외부 데이터이므로 구문 분석할 문자열을 제어할 수 없지만 강력한 코드를 작성하려면(항상 원하는 것이어야 함) 악의적인 공격자가 주입하거나 외부 구성 요소가 손상된 데이터를 항상 예상해야 합니다.손상된 데이터 스트롤에 대해서는 스로우하지 않지만 불법 입력 데이터를 탐지하기 위해서는 더 명확한 코드가 필요합니다.std::stoll and boost::lexical_cast do auto detect and signal crapy input 하지만, 종료되지(TM) 않으려면 어딘가에서 예외를 포착해야 합니다.

따라서 주변 코드의 구조에 따라 하나를 선택하거나 둘 중 하나를 선택하면 파싱된 결과(때로는 불법적인 데이터를 0으로 "파싱"하는 것이 절대적으로 괜찮습니다)를 파싱하고 지속할 데이터의 소스와 개인적 선호도도 마찬가지입니다.사용 가능한 두 기능 모두 일반적으로 다른 기능보다 우수하지 않습니다.

여기서는 HEX 문자로 구성된 String을 uint64_thex 값으로 변환합니다.문자열의 모든 개별 문자는 1개씩 16진수로 변환됩니다.예를 들어 베이스 10 -> 문자열 = "123":

  • 첫 번째 루프 : 값이 1입니다.
  • 두 번째 루프 : 값은 1*10 + 2 = 12입니다.
  • 세 번째 루프 : 값은 12*10 + 3 = 123입니다.

따라서 이 논리는 String of HEX 문자를 uint_64hex 값으로 변환하는 데 사용됩니다.

uint64_t stringToUint_64(String value) {
  int stringLenght = value.length();

  uint64_t uint64Value = 0x0;
  for(int i = 0; i<=stringLenght-1; i++) {
    char charValue = value.charAt(i);

    uint64Value = 0x10 * uint64Value;
    uint64Value += stringToHexInt(charValue);
  }

  return uint64Value;
}

int stringToHexInt(char value) {
  switch(value) {
    case '0':
      return 0;
      break;
    case '1':
      return 0x1;
      break;
    case '2':
      return 0x2;
      break;
    case '3':
      return 0x3;
      break;
    case '4':
      return 0x4;
      break;
    case '5':
      return 0x5;
      break;
    case '6':
      return 0x6;
      break;
    case '7':
      return 0x7;
      break;
    case '8':
      return 0x8;
      break;
    case '9':
      return 0x9;
      break;
    case 'A':
    case 'a':
      return 0xA;
      break;
    case 'B':
    case 'b':
      return 0xB;
      break;
    case 'C':
    case 'c':
      return 0xC;
      break;
    case 'D':
    case 'd':
      return 0xD;
      break;
    case 'E':
    case 'e':
      return 0xE;
      break;
    case 'F':
    case 'f':
      return 0xF;
      break;
  }
}

언급URL : https://stackoverflow.com/questions/7502926/what-is-atoi-equivalent-for-64bit-integeruint64-t-in-c-that-works-on-both-unix

반응형