Konvertering nummer till lägre nummer

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
toffie
Inlägg: 1619
Blev medlem: 22 juli 2004, 21:38:07
Ort: Stockholm - Linköping
Kontakt:

Konvertering nummer till lägre nummer

Inlägg av toffie »

Hej på er,

Det här är skitsvårt för mig, siffror har aldrig varit min grej..

Jag har en RFID taggläsare som ger ut 0194187668 - dvs 10 siffror. Vad kan man kalla detta för bit längd?
På den RFID tagg som jag läser av och får ovanstående värde så står det 296304500 och med en siffra framför blir det totalt 10 siffror som jag är "van" vid.


Jag behöver på något sätt få 0296304500 att bli 0194187668.

Varför frågar jag detta? Jo därför att de taggläsare jag har kan bara läsa in ett visst antal bitar.. som jag har för mig är 32 bitar.

Så när jag läser in exempelvis 0323955724 som står på en annan RFID tagg så får jag på min taggläsare 0005188620.
Om jag då kör (i PHP) följande kod;

Kod: Markera allt

(0323955724 & 0xffffff);
Så får jag ut 0005188620.

Men jag förstår det inte!!! Jag har ingen som helst aning om varför eller hur detta fungerar.

Och det värsta är.. jag vet inte varför med den koden 0323955724 kan bli konverterat till 0005188620 men däremot kan inte 0296304500 bli konverterat till 0194187668.

Jag har provat olika hex värden med fler och färre f inblandade, och visst kan jag få ett lägre eller högre värde än det jag önskar, men jag kan inte få det till exakt 0194187668..


Kan någon hjälpa mig med vad jag behöver för hex värde, eller på annat sätt - helst i PHP - så jag kan konvertera värdet rätt?

Tack på förhand!
Användarvisningsbild
rvl
Inlägg: 2839
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Konvertering nummer till lägre nummer

Inlägg av rvl »

Ser inget uppenbart samband med problemsiffrorna. Har du tillgång till mobil med NFC? En app kan läsa hela koden och presentera den i ett antal olika format. (Bit-riktningar t.ex.) Finns för övrigt ett par andra trådar på samma tema.

Det fungerande exemplet maskar bort allt förutom de 24 lägsta bittarna och presenterar resultatet i decimalform.

Kod: Markera allt

323955724
=
134F2C0C
& ffffff
  4F2C0C
=
5188620	
xxargs
Inlägg: 9906
Blev medlem: 23 september 2006, 14:28:27
Ort: Södertälje

Re: Konvertering nummer till lägre nummer

Inlägg av xxargs »

ln(1 * 10^11 - 1) / ln(2) = 36.54 bit i entropi. (i praktiken måste du ha 37 bitar för att kunna representera talrymd från 0 till tal med 10 '9':or decimalt i binär form)

problemet med läsning 32-bit är att du tappar information om 33-37 bit om adresseringen/datat använder fullt ut all 10 decimaltalsplatser (tex. att det är hashat värde).

- det är 5 bitar som saknas i läsningen vilket gör att det är en osäkerhet på 32 olika alternativ varav en är rätt för varje avhuggen 32-bits läsning. Använda talrymd är större än den du har i läsaren

enda vägen att kringgå detta är troligen att skaffa läsare som klarar mer än 32 bitar IMHO.
Användarvisningsbild
arvidb
Inlägg: 4287
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Konvertering nummer till lägre nummer

Inlägg av arvidb »

Det verkar inte vara bitlängden som är problemet i detta fall, eller bitriktningen:

Kod: Markera allt

296304500 = 0b0001 0001 1010 1001 0011 1111 0111 0100
194187668 = 0b0000 1011 1001 0011 0001 0001 1001 0100
Jag ser då inget samband. Vad säger tillverkaren av korten, hur är det tänkt att numret på taggen ("296304500") ska matcha det avlästa värdet?
xxargs
Inlägg: 9906
Blev medlem: 23 september 2006, 14:28:27
Ort: Södertälje

Re: Konvertering nummer till lägre nummer

Inlägg av xxargs »

kanske Exor:at med något värde
bearing
Inlägg: 9090
Blev medlem: 2 mars 2006, 01:01:45
Ort: Vänersborg

Re: Konvertering nummer till lägre nummer

Inlägg av bearing »

Ifall man XOR:ar de två får man 0x1a3a2ee0
Dvs ifall någon av de två XOR:as med 0x1a3a2ee0 fås den andre.

Men 0x1a3a2ee0 verkar inte vara någon vanlig "nyckel". Ger inte några träffar iaf.

Jag kan inte heller så något samband mellan dem.

Är du säker på att det inte finns en annan siffra någonstans?
xxargs
Inlägg: 9906
Blev medlem: 23 september 2006, 14:28:27
Ort: Södertälje

Re: Konvertering nummer till lägre nummer

Inlägg av xxargs »

EXOR behöver inte vara nyckel för att vara hemlig - kanske bara scramblingskod för bitspridning och att alla 10 decimala positioner fylls upp med siffror även när man räknar '1,2,3,4... som indata utan för många lika bits/siffror i serie mellan positionerna.

kanalkodning av olika slag tar ofta hänsyn till som DC-neutralitet över ett visst antal lika bit längd för att klara passage i trafo/kondensator - dvs lika många '1' som '0' efter x antal bit oavsett mönster på indata , noise-shaping för att klara EMC-tester etc.
Användarvisningsbild
rvl
Inlägg: 2839
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Konvertering nummer till lägre nummer

Inlägg av rvl »

Hoppas på att höra om nån alternativ läsare läser ut nåt annat.
Användarvisningsbild
MadModder
Co Admin
Inlägg: 24804
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Re: Konvertering nummer till lägre nummer

Inlägg av MadModder »

Det som står på första taggen är ett R-nummer. Det beräknas på samma sätt som RCO (mifare)-nummer fast med big endian istället för little endian.
R-nummer består av en halva med 4 siffor, och en halva med 5 siffror. Det ska alltså vara bara nio siffror.

Det du läser ut från din läsare är UID.
UID=0194187668 (decimal presentation av 0B931194)


Ta UID/65536 (bort med decimalerna)
Ta svaret mod 10000. Eftersom svaret redan är mindre än 10000 blir det ingen skillnad.
Du har nu 2963. Det är de första fyra. Det är redan 4 siffror så ingen nolla behöver läggas före.

Ta nu UID mod 65536.
Nu är det bara 4 siffor, så lägg en nolla framför = 04500

Lägg dessa tal efter varandra = 296304500

Det går såklart att räkna baklänges. Ta första delen på 4 siffror och multiplicera med 65536, och addera sen andra halvan på fem siffror.
2963*65536+4500 = 194187668, och så en nolla innan för att få 10 siffror = UID. :)

Eftersom man dividerar UID flera gånger för att få fram R-nummer, går det inte alltid att räkna baklänges om delsvaret innan MOD är stort.
Vilket betyder att flera olika UID har samma R-nummer.
Följande 32-bitars UID får samma R-nummer:
0194187668
0849547668
1504907668
2160267668
2815627668
3470987668
4126347668


Numret som står på den andra taggen är inte ett R-nummer. Det är något annat.
Det är dock lite märkligt att bara 24 bitar läses in från den, när det läses in 32 från första taggen. :humm:

[edit]
Tog bort en onödig beräkning

[edit igen]

Mod är alltså förkortning av modulo. På svenska blir det rest.
10 modulo 3 blir 1. 3 går 3 gånger i 10, och kvar blir 1.
Med PHP skriver man t.ex echo (10 % 3)
Och UID mod 65536 är UID % 65536
Användarvisningsbild
MadModder
Co Admin
Inlägg: 24804
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Re: Konvertering nummer till lägre nummer

Inlägg av MadModder »

Jaha, får du någon ordning på taggarna? :D
simply
Inlägg: 389
Blev medlem: 19 januari 2006, 11:27:36
Ort: sthlm
Kontakt:

Re: Konvertering nummer till lägre nummer

Inlägg av simply »

Har liknande problem med ett system som använder sig av 1wire-tags. Det ID som man läser ur via en vanlig 1wire-adapter passar inte med det ID man lägger in i passersystemet...
Användarvisningsbild
MadModder
Co Admin
Inlägg: 24804
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Re: Konvertering nummer till lägre nummer

Inlägg av MadModder »

Nej, jag har hittills aldrig varit med om att den råa datan som finns i en tag används i mjukvaran.
Det gäller att klura ut hur det förhåller sig. :D
Är det frågan om dubbelriktad kommunikation kan man ju aldrig få ut rätt ID med en enkel läsare.

Håller på att knåpa ihop ett excel-blad som konverterar från UID till allehanda standarder.
Det var så jag hittade att det ovan var ett R-nummer.
Skrev in UID och kollade genom alla uträknade nummer och ett stämde. :)

Och i denna tråd blev jag påmind om att lägga in en kolumn för decimal presentation av 3 bytes.
Har läst av några taggar som är märkta med flera nummer, varav ett är AX-nummer, och det är 24 bitar. )

Så nu funkar A-nummer (APS), AX-nummer, AXV-nummer, R-nummer på 40-bitstaggar
Samt RCO och Wiegand26 på 32- och 24-bitstaggar. :)

Saknas gör B-nummer, S-nummer, MFD-nummer, och MFR-nummer på 40-bitstaggar. :D
Har inte hittat nån logik där än...
simply
Inlägg: 389
Blev medlem: 19 januari 2006, 11:27:36
Ort: sthlm
Kontakt:

Re: Konvertering nummer till lägre nummer

Inlägg av simply »

Kan man få testa det där excel-bladet och se om jag får någe klarhet med mina koder?

/A
Användarvisningsbild
MadModder
Co Admin
Inlägg: 24804
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Re: Konvertering nummer till lägre nummer

Inlägg av MadModder »

Visst. Här är det.
RFID ID-konverterare.zip
Inte ”klart” eller städat och fint på långa vägar.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
toffie
Inlägg: 1619
Blev medlem: 22 juli 2004, 21:38:07
Ort: Stockholm - Linköping
Kontakt:

Re: Konvertering nummer till lägre nummer

Inlägg av toffie »

Hej på er! Så ledsen för att jag inte svarat tidigare, har helt enkelt konstant glömt bort, har ju sett på mailen att jag fått svar men varit fullt upptagen med jobbet, katterna och sen sova i stort sett..

rvl - det är dessvärre inte Mifare/NFC utan EM. Jag förstår.. jag märkte även det med maskningen när jag la till fler "f", då kom ju mer av taggnumret med. Men jag förstår inte varför.. varför används just f och inget annat värde? Det jag märkte när jag provade, i stort sett, genom hela HEX serien från 0 till F så startade "värdena" om ungefär var tredje försök.. kommer inte ihåg exakt, men säg att F ger "rätt" värde, E gav något annorlunda, D likaså, men C gav samma värde som F.. Hajar inte detta alls, men förmodar att det har med den binära biten att göra, att ettor och nollor hamnar på samma sätt för just de bitarna som är viktiga i detta fall i både F och C med flera ner till 0.

Om det går att förstå..

xxargs - underbart, men hur kommer man fram till att det ska vara 37 bitar för tal med 10 stycken 9:or? Alltså, jag förstår binärt någorlunda bra - tycker jag - kan även räkna med binärt någorlunda enkelt.. Men just att få 10 stycken 9or till 37 bitar.. där saknar jag något!

Jag håller helt och hållet med om att en läsare som kan läsa fler bitar är definitivt en väg att gå, men lämpar sig inte just för tillfället. Men jag ska absolut försöka hitta en bättre läsare!

arvidb - nej precis, jag har också tittat på de binära bitarna och jämfört siffrorna rakt av och det finns ju inga likheter, vilket det förstås gör med 0323955724 och 0005188620, där också & 0xffffff fungerar utan problem. Vilket senare är uppenbart med MadModders svar, som vi inte visste innan han svarade förstås :P

bearing - spännande, jag undrar om detta är unikt med just dessa två värden eller om det fungerar med samtliga "taggar" med samma upplägg..?

xxargs - "EXOR behöver inte vara nyckel för att vara hemlig" kan vara något helt klart, jag har funderat på om det är någon "kod" inblandad för att koda de nummer som kan utläsas och sedan trycks på taggarna, men vet ju inte helt säkert.. I detta fall så kanske det inte är det ändå, just på grund av MadModders svar.


Och så har vi MadModder vilket jäkla jobb du gjort! Hur många nätter har du suttit uppe och grubblat för att få till den här uträkningen!? Den är ju helt totalt ologisk - enligt mig förstås.. Men den fungerar ju, nästan alltid! Jag provade denna uträkning och den fungerar så när som på alla taggar förutom ett par där det blir både nästan ingen skillnad upp till stor skillnad - vilket gör att det inte går att matcha förstås.

Ett exempel är 0194261298 som blir 0296412594 (med adderad nolla framför). För 0296412594 finns ingen matching, inte heller 296412594.. Däremot om man tar bort sista siffran (4) så finns det ett taggnummer som istället slutar på en etta (1) istället för fyran. Om detta är en "lyckoträff" så nära det bara går vet jag inte, eller om det helt enkelt är en slump att det råkade finnas 296412591 registrerat i databasen. Det kan ju även vara som du säger MadModder att värdet blir fel på grund av för många "divideringar" :P

Numret på den andra taggen är inte specifikt för RCO, det skiljer dock från det som läses av på mina taggläsare men eftersom det rakt av går med samma taggar i samma serie att just använda "& 0xffffff" för att ta ut ett mindre antal bitar från det värde som är printat fysiskt på taggen, så är jag nöjd med den biten. De numrena som står på taggen görs ju om från X bitar till 32bitar som jag förstått att mina taggläsare kör på.

Känns ju lite skumt att samtliga dessa får samma "utvärde" 0194187668, 0849547668, 1504907668, 2160267668, 2815627668, 3470987668, 4126347668. Det känns ju inte vidare "säkert" att räkna ut och matcha värdet på detta sätt? Risken finns, även om den är liten att det finns någon annan tagg registrerad i systemet som har en av de andra siffer värdena och på så sätt matchas fel användare i systemet?

Har du någon förklaring till vad R, AX, A(APS), AXV, B, S, MFD och MFR står för?
Förmodar att R är RCO då eller? Du har ju RCO kolumner också.. hmm.. A(APS) kanske är Aptus? AX är axema? S kanske är Solid?

Riktigt grym Excel också!! Tittade lite på formlerna men de ser ju galet svåra ut, jämfört med din beskrivning här i tråden just för RCO :P



Ni undrar säkert vad jag egentligen håller på med och detta rör ett passersystem som jag utvecklat under ett par år där jag försöker att läsa av andra fabrikats taggar, däribland RCO som MadModder helt magiskt lyckades lista ut rakt av.. hur - kan jag verkligen inte förstå!? Läsa av taggarna har ju aldrig varit något problem egentligen, jag får ut min lilla sträng från taggarna och normalt sett så läser man in taggarna i systemet och sedan går de ut till användning. Men i detta fall fanns befintliga taggar som skulle användas och då stod det såklart nummer på dem och jag och ägarna trodde det helt enkelt bara var att skriva av numret in i systemet och att det skulle fungera, vilket det definitivt inte gjorde :P Därav denna tråden förstås.

Vet inte om dessa kan hjälpa något med att ställa upp en tabell och/eller verifiera redan funna uträkningar?
testkort.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar