在C中将字节转换为Int / uint

我有一个unsigned char数组[248]; 填充字节。 像2F AF FF 00 EB AB CD EF ……这个arrays是我的字节流,我将来自UART(RS232)的数据存储为缓冲区。

现在我想将字节转换回我的uint16和int32。

在C#中,我使用BitConverter类来执行此操作。 例如:

byte[] Array = { 0A, AB, CD, 25 }; int myint1 = BitConverter.ToInt32(bytes, 0); int myint2 = BitConverter.ToInt32(bytes, 4); int myint3 = BitConverter.ToInt32(bytes, 8); int myint4 = BitConverter.ToInt32(bytes, 12); //... enter code here Console.WriteLine("int: {0}", myint1); //output Data... 

C中是否有类似的function? (没有.net,我使用KEIL编译器,因为代码在微控制器上运行)

关心萨姆

解决方案:方式A)

首先我必须将数组转换或初始化为uint8_t ARRAY [248]; 然后我在你的帮助下使用了这段代码:

  uint32_t* myint1 = (uint32_t *)&RXBUFF[2]; //test uint16_t* myint2 = (uint16_t *)&RXBUFF[6]; //test3 

注意:hex中的int值“1985”在myint2中表示为0x07C1。 我发出的字节是“C1 07”,因此微控制器正在改变字节顺序

我也将测试其他方法。

WR山姆:)

就在这里。 假设你的字节在:

 uint8_t bytes[N] = { /* whatever */ }; 

我们知道,16位整数只是连接的两个8位整数,即一个具有256的倍数或者可以移位8:

 uint16_t sixteen[N/2]; for (i = 0; i < N; i += 2) sixteen[i/2] = bytes[i] | (uint16_t)bytes[i+1] << 8; // assuming you have read your bytes little-endian 

类似地,对于32位:

 uint32_t thirty_two[N/4]; for (i = 0; i < N; i += 4) thirty_two[i/4] = bytes[i] | (uint32_t)bytes[i+1] << 8 | (uint32_t)bytes[i+2] << 16 | (uint32_t)bytes[i+3] << 24; // same assumption 

如果字节被读取为big-endian,当然你会颠倒顺序:

 bytes[i+1] | (uint16_t)bytes[i] << 8 

 bytes[i+3] | (uint32_t)bytes[i+2] << 8 | (uint32_t)bytes[i+1] << 16 | (uint32_t)bytes[i] << 24 

请注意,存储的整数中的endian-ness与正在运行的体系结构的endian-ness之间存在差异。 本回答中提到的字节序是存储的整数,即bytes的内容。 解决方案独立于运行架构的字节序,因为在移位时会考虑到字节序 。

在C中没有为你做的标准函数。你必须自己将字节组装回16位和32位整数。 关注字节序!

这是一个简单的小端实例:

 extern uint8_t *bytes; uint32_t myInt1 = bytes[0] + (bytes[1] << 8) + (bytes[2] << 16) + (bytes[3] << 24); 

对于大端系统,它只是相反的顺序:

 uint32_t myInt1 = (bytes[0] << 24) + (bytes[1] << 16) + (bytes[2] << 8) + bytes[3]; 

你可能会逃脱:

 uint32_t myInt1 = *(uint32_t *)bytes; 

如果你对对齐问题很小心。

  char letter = 'A'; size_t filter = letter; filter = (filter << 8 | filter); filter = (filter << 16 | filter); filter = (filter << 32 | filter); printf("filter: %#I64x \n", filter); 

结果:“filter:0x4141414141414141”

在小端的情况下,你不能只使用memcpy吗?

 memcpy((char*)&myint1, aesData.inputData[startindex], length);