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

时间:2012-09-02 22:31:54

标签: c arrays serialization int byte

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

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

在C#中,我使用BitConverter类来执行此操作。 e.g:

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编译器,因为代码在微控制器上运行)

关心 萨姆

4 个答案:

答案 0 :(得分:19)

在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;

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

答案 1 :(得分:11)

是的。假设你的字节在:

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的内容。自endian-ness is taken care of when shifting以来,解决方案独立于正在运行的体系结构的字节序。

答案 2 :(得分:0)

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

结果:&#34;过滤器:0x4141414141414141&#34;

答案 3 :(得分:0)

对于little-endian,你不能只使用memcpy吗?

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