演员似乎很好;虽然,我不知道为什么当你的数组uint32_t
s是512时说你的i < 504
。(如果你确实想要只转换504值并且你想要一个512长度的数组,你可能想用array[512] = {0}
来确保内存是归零,而不是最后的8个值被设置为以前在内存中的任何值)。但是,可以绝对安全地说:SomeArrayOfLargerType[i] = (largerType_t)SomeArrayOfSmallerType[i]
,但请记住,现在它是如何的,你的二进制文件最终会看起来像这样:
0100 0001 -> 0000 0000 0000 0000 0000 0000 0100 0001
因此,那些24个领先的0
可能是一个不希望的结果。
至于总结四个字符,那几乎肯定不能解决你想要的问题;除非你真的想要像0000 0001
(一)+ 0000 0010
(二)= 0000 0100
(三)。如果您希望前面的示例生成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位)存储字节,所以您需要四种不同的情况来确定转换的距离。在第一种情况下,前8位由消息中的一个字节填充。在第二种情况下,第二个8位由消息中的后续字节填充(,左移8位,因为这是二进制位置的偏移量)。然后继续剩余的2个字节,然后重复从最初的消息数组的下一个索引开始。
组合字节时,使用|=
,因为它将采用已在uint32中的内容,并且它将对其执行按位或运算,因此最终值将合并为一个单一值。
因此,要打破一个简单的例子,像什么,我在我的初始后,让我们说我有0000 0001
(一个)和0000 0010
(二),最初的16位整数追究他们0000 0000 0000 0000
。第一个字节分配给16位整数使其成为0000 0000 0000 0001
。然后第二个字节左移8,使其成为0000 0010 0000 0000
。最后,这两个是通过按位或,所以16位整数变成:0000 0010 0000 0001
。
在一个32位整数保存4个字节的情况下,该过程将重复2次多8次额外的移位,然后进入下一个uint32重复该过程。
希望大家都有道理。如果不是,我可以尝试进一步澄清。
我显然确实需要使用班次以使CRC符合老师的答案。他告诉我尝试使用4个16位块来计算每64位线的CRC。但是,unsigned int必须是32位。我假设我需要将字符转移到数组中以将其转换为32位来创建块。另外,我觉得未来会有很好的知识。你介意帮助我吗? – starlight
@starlight,个人而言,我从来没有看过CRC校验和的实现,所以我不能给你一个确切的答案,说明如何解决这个问题(这可能更好,因为整个课程的目的是弄清楚独立完成这些事情)。但是,我会给你一个如何做到这一转变的一般例子。给我几分钟更新答案。 – SpencerD
谢谢,我应该能够从那里去! :) – starlight