2015-02-03 1 views
0

현재 RFID 카드에서 필요한 결과 데이터를 얻는 데 어려움을 겪고 있습니다. 디코딩되었지만 이제 카드 뒷면에서 최종 카드 번호를 얻으려면 몇 가지 작업을 더해야합니다.RFID 데이터 16 진수 수학 문제 디코딩 C++

이상한 값은 E ******** e입니다. 복호화가 0000003048121263b으로 바뀌 었습니다.

이제 원하는 카드 번호를 얻으려면 3 단계가 더 필요합니다.

단계 1) 하위 20 비트를 마스크 처리해야합니다. (어느 것이 나에게 0x1263B를 제공해야합니까?) C++을 사용하는 방법에 대해서는 확신이 없습니다.

단계 2) 하위 패리티 비트 (0x931d 여야 함)를 제거하기 위해 2로 나눕니다. 그리고 다시, 저는 C++에서 이것을 수행하는 방법을 알지 못합니다.

3 단계) 16 진수 값을 10 진수 값 (원하는 카드 번호와 같음)으로 변환하십시오. 이것은 C++을 사용하여이 시점에서 쉽게 이루어져야합니다 - 비록 제가 1 단계에서부터 확인하기는 어렵지만). 복잡하고 그것이 무엇을 수행하지만, 정확한 출력을 제공 이유를 이해하지 못하는 - 정규식이 대부분의 사람들에게하는 것처럼

const char* original = "0x931d"; 
unsigned long n = std::strtoul(original, nullptr, 16); 

이 모든

나에게 보인다.

모든 도움을 주시면 감사하겠습니다.

답변

0

1 단계) 하위 20 비트를 마스크 (나는 그 C++을 사용하는 것에 대해 이동하는 방법이 확실하지 오전) 나에게 0x1263B를 제공해야한다.

먼저 저장하거나 마스크하려는 각 비트에 대해 1을 포함하는 이진 값을 만듭니다. 귀하의 경우 0b111 1111 1111 1111 1111 또는 0xFFFFF 이고 & 연산자를 사용하여 마스크 값을 입력하십시오. (2)에 의한

result = value & 0xFFFFF; 

단계 2) 나누기 0x931d되어야 하부 패리티 비트()를 없애기. 그리고 다시, 저는 C++에서 이것을 수행하는 방법을 알지 못합니다.

2로 나누는 것은 값을 1 씩 오른쪽으로 시프트하는 것과 같습니다.

result = result >> 1; 

3 단계) 내 원하는 카드 번호와 동일 할 진수 값을 16 진수 값 (변환). 이것은 C++을 사용하여이 시점에서 쉽게 이루어져야합니다 - 비록 제가 1 단계에서부터 확인하기는 어렵지만).

이 것이 필요합니까? 전환은 사용자에게만 해당됩니다.

cout << result; 
+0

** 결과 **로 설정해야하는 데이터 유형은 무엇입니까? – StealthRT

+0

'result'의 데이터 유형은 최소 20 비트의 부호없는 정수 여야합니다. –