CRC Berechung Matlab -> C++
-
Hallo Leutz,
ich habe eine Berechung einer Checksumme in Matlab die ich nach C++ konvertieren muss. Es ist eigentlich bis auf die Tatsache das es einen beliebig großen Stream verarbeiten kann ein ganz normaler Algorithmus (Schieberegister):
(der Code funktioniert)% im G steht das Generatorpolynom M = [m zeros(1,length(G)-1)]; M = fliplr(M); M_size = length(M); register_size = length(G); register = zeros(1,register_size); step = 0; while M_size step = step + 1; register = circshift(register',-1)'; factor = register(1); register(register_size) = M(M_size); if step >= register_size register = double(xor(register,G(1:register_size)*factor)); end M_size = M_size - 1; end R = register(2:end); % Hier steht die ChecksumIch habe jetzt schon mal überlegt wie ich da ran gehe das Problem ist nur wie ich mir so ein Schieberegister aufbaue, speziell wie ich eine Matrix transponiere. Ich stell mir das so vor das ich ein Feld auf mach z.B. matrix[238][238] und vertausche mit einer Schleife Zeilen und Spalten, die Lösung find ich aber ehrlich gesagt ziemlich uncool so bleiben doch 238*238-(238+237)= 56169 Zellen ungenutzt??
Hat mir jemand vielleicht eine Anregung?
-
Hab die Aufgabe nun selber gelöst:
INT32 crc_computer(INT8 *m) { INT32 P = 0x823BA9; INT32 G = P^(P<<1); INT8 m_G[25]; for (int i=0;i<25;i++) { if (G&(1<<i)){ m_G[25-1-i]=1; }else{ m_G[25-1-i]=0; } } INT8 M[238]; for (int i=0; i<238; i++){ M[238-1-i]=m[i]; } int M_size = sizeof(M); int register_size = sizeof(m_G); INT8 m_register[25]={0,1,0,0,0,0,1,1,0,0,1,0,0,1,1,0,0,1,1,1,1,1,0,1,1}; int step=0; int factor=0; do{ step++; // shift register INT8 temp [25]; for (int i=0;i<24;i++) temp[i] = m_register[i+1]; temp[24]=m_register[0]; for (int i=0;i<25;i++) m_register[i] = temp[i]; factor = m_register[0]; m_register[register_size-1] = M[M_size-1]; if (step>=register_size){ for (int i=0;i<register_size;i++){ m_register[i]^=(m_G[i]*factor); } } M_size--; }while(M_size); INT32 chkSum=0; for (int i=1;i<25;i++){ if (m_register[i]){ chkSum|=(1<<(24-i)); } } return (chkSum); }Gruss