繁体   English   中英

表示char *到unsigned int

[英]what does it mean?casting char* to unsigned int

我在下面阅读了一些代码:

typedef unsigned int uint32_t;    
typedef unsigned short uint16_t;

inline uint16_t NS(uint16_t i16)
{
    return((i16 << 8) | (i16 >> 8));
}

inline uint32_t NL(uint32_t i32)
{
    return((uint32_t(NS(i32)) << 16) | NS(i32>>16));
}

char* data = (char*) malloc(10);

strcpy(data, "123456789");
const char *m_data = (const char *)data;
uint32_t i32 = *((uint32_t*)m_data);
i32 = NL(i32);
m_data += 4u;

我不明白uint32_t i32 = *((uint32_t*)m_data); ,这是什么意思?

而且不了解i32 = NL(i32); m_data += 4u; i32 = NL(i32); m_data += 4u; 以及功能NS和NL。

有人可以告诉我吗?

代码有错误(会泄漏内存):

char* data = (char*) malloc(10);
data="123456789\0";

应该:

char* data = (char*) malloc(10);
strcpy(data, "123456789");

这也意味着您无法告诉任何有关data指针对齐的data ,而来自malloc()的赋值可以保证数据对于任何基本类型都具有足够的对齐方式。 但是,这与接下来的两行问题是切线的:

const char *m_data = (const char *)data;
uint32_t i32 = *((uint32_t*)m_data);

在这些行的第一行中进行强制转换是不必要的,但没有害处。 下一行将存储在m_data中的指针视为uint32_t指针,对其进行取消引用,然后将结果分配给i32 如果值m_data是从哪里来的data ,其来自malloc()数据将是足够充分顺应了这个不是一个问题。 对于字符串分配,不能保证m_data中的指针对齐得足够好以用作uint32_t指针。 因此,所有地狱可能会破裂,或者您可能会好起来。 由于内存泄漏,行为未定义。

NS()函数按字节交换16位整数。 NL()函数在32位整数中交换16位值。 这意味着您以“开始”图中显示的值开始,然后以“完成”图中显示的值结束。

+------+------+------+------+
|  MSB | NMSB | NLSB |  LSB |   Start
+------+------+------+------+

+------+------+------+------+
|  LSB | NLSB | NMSB |  MSB |   Finish
+------+------+------+------+

m_data += 4u; 将4加到指针m_data ,所以不是在指向1的字符串,它在点5

uint32_t i32 = *((uint32_t*)m_data);

从字面上看,这意味着将指针m_data解释为指向uint32_t的指针并对其取消引用。 目的是将data指定的字符解释为uint32_t

函数NS和NL似乎正在取其参数左右两半的按位“或”并将其返回。

m_data += 4u;

这应该等效于不带后缀的相同语句。 它只是将指针m_data递增到指向该地址之前指向的字符上方四个字符的字符。

因此,当给NS一个16位值i16 (每个字符为一位)时:

aaaaaaaabbbbbbbb

那么表达式i16 << 8 (左移8位,右移零)将为您提供bbbbbbbb00000000i16 >> 8将为00000000aaaaaaaa 将这些或运算在一起可得出:

   bbbbbbbb00000000
OR 00000000aaaaaaaa
   ----------------
   bbbbbbbbaaaaaaaa

换句话说,它交换了两个字节。

N32函数的同N32在32位值中交换16位一半,但由于它还在每个一半上调用N16 ,因此执行以下转换:

aaaaaaaabbbbbbbbccccccccdddddddd
               ||
               VV
ddddddddccccccccbbbbbbbbaaaaaaaa

当您的特定体系结构上的顺序不同时,通常在转换为网络字节顺序或从网络字节顺序转换时使用。


语句系列:

const char *m_data = somethingOrOther;
uint32_t i32 = *((uint32_t*)m_data);

工作原理如下。 首先,它将字符指针转换为32位值的指针。 然后,它取消引用该指针以提取32位值。

这意味着将字符串"1234"的前四个字符(假设char数据类型为8位)视为32位整数值,并传递给N32以进行上述字节交换操作。

最后, m_data += 4u只是将无符号值4添加到字符指针,以便其前进到下一个 32位值(在"5678" )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM