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

问题描述 投票:0回答:5

我有一个无符号字符数组[248];充满字节。如 2F AF FF 00 EB AB CD EF ..... 这个数组是我的字节流,我将来自 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 中有类似的函数吗? (没有 .net ,我使用 KEIL 编译器,因为代码在微控制器上运行)

谨致问候 山姆

c arrays serialization int byte
5个回答
44
投票

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;

如果您小心对齐问题。


20
投票

是的,有。假设您的字节位于:

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

如果字节是大端读取,当然你颠倒顺序:

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

请注意,存储的整数的字节序和运行架构的字节序之间存在差异。本答案中提到的字节序是存储的整数,即

bytes
的内容。这些解决方案独立于正在运行的架构的字节序,因为在移位时会考虑字节序。


5
投票

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



1
投票
结果:“过滤器:0x4141414141414141”


0
投票

char* bytes = "\xAA\xBB\xCC\xDD\xEE\xFF"; uint64_t n = *(uint64_t*)bytes;

© www.soinside.com 2019 - 2024. All rights reserved.