c - 在C 中,数组将字节转换为 int/uint

  显示原文与译文双语对照的内容
124 1

我有一个无符号字符 array [248] ;充满字节。如 2F AF FF 00 CD有效。这个 array 是我的字节流,我将来自 UART ( RS232 )的数据存储为缓冲区。

现在,我想将字节转换回my的我和 uint16.

在 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 中有类似的功能?( 没有. NET,我使用KEIL编译器,因为代码在微控制器上运行)

关于 Sam

解决方案:方法)

首先,我必须将 array 转换成 uint8_t array [248],然后将它的初始化;然后,我将这里代码与你的帮助一起使用:

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

注意:十六进制值" 1985"在myInt2中表示为 0 x07C1.我发送的字节是"c1 07",所以微控制器正在改变字节顺序

我也会测试其他方法。

):

时间:原作者:0个回答

82 0

是的假定你的字节位于:

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

如果 16位整型整数是两个位整数,则 换句话说,一个是 256,或者是 shifted shifted

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

如果字节读取大尾数,当然,你将颠倒顺序:

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

注意,存储整数中的pre ness和正在运行的体系结构的pre ness之间存在区别。这个答案中引用的结果是存储的整数,换句话说,bytes的内容。解决方案独立于运行架构的前端特性,因为在转移时,会照顾到前端的。

原作者:
139 0

没有标准的功能可以为你做这件事。你必须将字节重新组合到 16 - 和 32位 整数中。endianness小心 !

下面是一个简单的小小写字母示例:

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;

如果你对对齐问题非常小心。

原作者:
...