함수는 vector<unsigned char> byteVector(long long UID)
이고, UID (64 비트 정수)의 바이트 표현은 vector
으로 반환됩니다. 이 벡터는 나중에이 데이터를 파일에 쓰는 데 사용됩니다.64 비트 정수를 7 비트 문자의 배열로 변환하십시오.
이제 파이썬으로 파일을 읽고 싶다고 결정했기 때문에 utf-8 표준을 준수해야합니다. 즉, only use the first 7bits of each char을 사용할 수 있습니다. 최상위 비트가 1이면 더 이상 ASCII 문자를 지원하기 때문에 더 이상 문자열로 디코딩 할 수 없습니다. 또한 ASCII 문자열을 지원하는 커맨드 라인 인터페이스 (Command Line Interface)를 통해이 문자열들을 다른 프로세스로 전달해야 할 것입니다.
그 문제가 발생하기 전에 8 별도의 바이트로 64 비트 정수를 분할에 대한 나의 접근 방식은 정말 좋은 일 다음은이었다 "
물론vector<unsigned char> outputVector = vector<unsigned char>();
unsigned char * uidBytes = (unsigned char*) &UID_;
for (int i = 0; i < 8; i++){
outputVector.push_back(uidBytes[i]);
}
구속으로, 더 이상 작동하지 않습니다 HBit 1하지 않을 수 있습니다 "물론이 함께 한 push_back
호출을 대체하는 것입니다 이제 각 unsigned char
127 내 가장 쉬운 옵션의 최대 값을 제한 :
outputVector.push_back(uidBytes[i]/128);
outputVector.push_back(uidBytes[i] % 128);
을하지만이 종류의 O를 보인다 f 낭비, 각각의 첫 번째로 unsigned char
쌍 수 밖에 0 또는 1 및 나는 낭비하는 일부 공간 (6 바이트) 그렇지 않으면 사용할 수 있습니다.
64 비트를 저장해야하고 바이트 당 7 비트를 사용할 수 있으므로 64 // 7 + 64 % 7 = 10 바이트가 필요합니다.
실제로는 (내가 작성한 파일 중 1KB에 도달 한 파일이 없습니다.)하지만 이전에 8 바이트를 사용하고 있었고 이제 10을 사용할 때 약간의 낭비가 될 것입니다 (9, 미안) 충분할 것입니다. 따라서 :
어떻게 64 비트 정수를 10 비트 7 비트 정수로 변환합니까?
이것은 아마도 너무 많은 최적화이지만이 문제 (아마도 시프트 연산자 사용)에 대한 아주 멋진 해결책이 될 수 있습니다. 그리고 나는 그것을보기에 정말로 관심이 있습니다.
base64는 11 바이트를 제공해야하며이를 구현하는 기존 라이브러리가 있어야합니다. 또한이 도구로 작업 할 수있는 도구가 많이 있습니다. –
나는 당신이 원하는 것을 얻지 못한다. 7 비트 튜플을 원하지만 바이트의 8 번째 비트를 기다리지 않습니까? 일반적으로 7 비트 변수는 없습니다. 만약 당신이 (이론적으로) 정의되지 않은 동작을 가진다면, 유니온과 비트 필드 구조체의 조합을 사용하십시오. – deviantfan
@deviantfan 문제는 UTF-8 코드 텍스트가 7 비트 (문자의 바이트 값이 127 이상이되지 않음)이기 때문에 8 번째 비트를 낭비하지 않기 때문에 각 바이트의 8 번째 비트를 낭비해야한다는 것입니다. 왜 그런지 묻지 말고 표준을 준수해야합니다. 설명을 위해 질문을 수정하겠습니다. – iFreilicht