2017-04-15 5 views
0

CRC 계산에 사용하기 위해 문자 배열을 uint32_t 배열로 변환하려고합니다. 이것이 올바른 방법인지 아니면 위험한 지 궁금하다. 나는 위험한 전환을하는 습관을 가지고 있으며 덜 위험한 것을 변환하는 더 좋은 방법을 배우려고 노력하고 있습니다. :). 배열의 각 문자는 8 비트라는 것을 알고 있습니다. 문자 중 4 개를 합하여 unsigned int 배열의 인덱스로 던지거나 각 문자를 별도의 배열에 배치하는 것이 좋습니다. 4 개의 8 비트 문자를 합산하면 값이 배열로 변경됩니까? 그러나 문자 이동에 대해 읽은 적이 있는데, 4 문자를 부호없는 int 배열의 하나의 인덱스로 이동하는 방법을 정확히 모르겠습니다.c에서 문자 배열을 uint32_t 배열로 변환하는 것이 적절한 방법입니까?

텍스트 [i]는 (는) 문자 배열입니다.

uint32_t inputText[512]; 
for(i = 0; i < 504; i++) 
{ 
    inputText[i] = (uint32_t)text[i]; 
} 

답변

1

캐스트가 정상적으로 보입니다. 비록 당신이 uint32_t의 배열이 512 일 때 i < 504라고 말하는 이유를 모르겠다. (504 값만 변환하고 512- 길이 배열을 원할 경우 array[512] = {0}을 사용하여 메모리를 확보 할 수있다. 그럼에도 불구하고 이전에 메모리에 있던 값으로 설정되는 마지막 8 개의 값 대신에 0으로 설정됩니다.) 그럼에도 불구하고 다음과 같이 말하면 안전합니다 : 그러나 이제는 바이너리가 결국

0100 0001 -> 0000 0000 0000 0000 0000 0000 0100 0001 

따라서 0을 유도하는 사람들은 바람직하지 않은 결과를 초래할 수 있습니다.

네 개의 문자를 요약하면 거의 원하는대로 작동하지 않습니다. 문자 그대로 0000 0001 (1) + 0000 0010 (2) = 0000 0100 (3)과 같은 합계를 원하지 않는 한. 이전 예제에서 00000001 000000010을 생성하려면 예, 교대를 적용해야합니다.

UPDATE-예를 통해 변화에 대한 일부 정보 : 당신은 그 예를 들어 여기에 실행 볼 수 있습니다

uint32_t valueArray[FINAL_LENGTH] = {0}; 
int i; 
for(i=0; i < TEXT_LENGTH; i++){ // text_length is the initial message/text length (512 bytes or something) 
    int mode = i % 4; // 4-to-1 value storage ratio (4 uint8s being stored as 1 uint32) 
    int writeLocation = (int)(i/4); // values will be truncated, so something like 3/4 = 0 (which is desired) 
    switch(mode){ 
     case(0): 
      // add to bottom 8-bits of index 
      valueArray[writeLocation] = text[i]; 
      break; 
     case(1): 
      valueArray[writeLocation] |= (text[i] << 8); // shift to left by 8 bits to insert to second byte 
      break; 
     case(2): 
      valueArray[writeLocation] |= (text[i] << 16); // shift to left by 16 bits to insert to third byte 
      break; 
     case(3): 
      valueArray[writeLocation] |= (text[i] << 24); // shift to left by 24 bits to insert to fourth byte 
      break; 
     default: 
      printf("Some error occurred here... If source has been modified, please check to make sure the number of case handlers == the possible values for mode.\n"); 
    } 
} 

: 다음은 이동의 예 것

https://ideone.com/OcDMoM을 (IDEOne에서 실행하면 런타임 오류가 발생합니다. 출력은 여전히 ​​정확하고 코드는 예제로 제공되기 때문에이 문제에 집중하지 않았습니다.)

기본적으로 각 바이트가 8 비트이기 때문에 4 바이트 청크 (각각 32 비트)로 저장하려면 4 단계가 필요합니다. 첫 번째 경우에는 첫 번째 8 비트가 메시지의 바이트로 채워집니다. 두 번째 경우에는 두 번째 8 비트가 메시지의 다음 바이트로 채워집니다 (은 이진 위치의 오프셋이기 때문에 8 비트만큼 왼쪽으로 시프트 됨). 그리고 나머지 2 바이트에 대해서도 계속 진행 한 다음 초기 메시지 배열의 다음 색인에서 시작하여 반복합니다.

바이트를 결합 할 때 |=이 사용됩니다. 이는 이미 uint32에있는 것을 취하고 비트 OR를 수행하므로 최종 값이 하나의 단일 값으로 결합됩니다.그래서

그들 0000 0000 0000 0000 개최하는 최초의 16 비트 정수로,이 전 0000 0001 (일)과 0000 0010 (이)가 말을하자, 내 초기 게시물에 무엇을했다 같은 간단한 예제를 분해합니다. 첫 번째 바이트는 16 비트 정수로 할당되어 0000 0000 0000 0001이됩니다. 그런 다음 두 번째 바이트는 8로 왼쪽으로 이동하여 0000 0010 0000 0000이됩니다. 마지막으로 두 비트는 비트 OR을 통해 전달되므로 16 비트 정수는 0000 0010 0000 0001이됩니다.

4 바이트를 보유하는 32 비트 정수의 경우 해당 프로세스가 8 번 더 이동하면 2 번 더 반복되고 다음 uint32로 진행되어 프로세스가 반복됩니다.

모두 의미가 있습니다. 그렇지 않다면, 나는 더 명확히하려고 노력할 수있다.

+0

분명히 선생님의 답과 일치하는 CRC를 얻으려면 교대조를 사용해야합니다. 그는 64 비트 라인 당 CRC를 계산하기 위해 4 개의 16 비트 덩어리를 사용하라고했습니다. 그러나 부호없는 int는 32 비트가되어야합니다. 내가 청크를 만들기 위해 32 비트로 배열에 문자를 이동해야한다고 가정합니다. 또한 미래에 대한 좋은 지식이 될 것 같습니다. 나를 도와 줄래? – starlight

+0

@starlight 개인적으로, 나는 CRC 체크섬의 구현에 대해 본 적이 없으므로, 어떻게 해결 될지에 대한 정확한 답을 줄 수는 없다. (코스에서의 전체 요점은 이러한 일을 독립적으로 수행하는 것). 그러나, 나는 그 변화를 어떻게 할 수 있는지에 대한 일반적인 예를 들어 줄 것입니다. 대답을 업데이트하려면 몇 분만 기다려주세요. – SpencerD

+0

고맙습니다.저기서 갈 수 있어야합니다! :) – starlight