캐스트가 정상적으로 보입니다. 비록 당신이 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로 진행되어 프로세스가 반복됩니다.
모두 의미가 있습니다. 그렇지 않다면, 나는 더 명확히하려고 노력할 수있다.
분명히 선생님의 답과 일치하는 CRC를 얻으려면 교대조를 사용해야합니다. 그는 64 비트 라인 당 CRC를 계산하기 위해 4 개의 16 비트 덩어리를 사용하라고했습니다. 그러나 부호없는 int는 32 비트가되어야합니다. 내가 청크를 만들기 위해 32 비트로 배열에 문자를 이동해야한다고 가정합니다. 또한 미래에 대한 좋은 지식이 될 것 같습니다. 나를 도와 줄래? – starlight
@starlight 개인적으로, 나는 CRC 체크섬의 구현에 대해 본 적이 없으므로, 어떻게 해결 될지에 대한 정확한 답을 줄 수는 없다. (코스에서의 전체 요점은 이러한 일을 독립적으로 수행하는 것). 그러나, 나는 그 변화를 어떻게 할 수 있는지에 대한 일반적인 예를 들어 줄 것입니다. 대답을 업데이트하려면 몇 분만 기다려주세요. – SpencerD
고맙습니다.저기서 갈 수 있어야합니다! :) – starlight