这是什么意思?将 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;
和函数NS和NL。
有人可以告诉我吗?
uint32_t i32 = *((uint32_t*)m_data);
这字面意思是将指针 m_data
解释为指向 uint32_t
的指针并解引用它。目的是将 data
指定的字符解释为 uint32_t
.
函数 NS 和 NL 似乎是对其参数的左右半部分进行按位或运算并返回它。
m_data += 4u;
这应该等同于没有 unsigned 后缀的相同语句。它只是递增指针 m_data
以指向其之前指向的地址上方四个字符处的字符。
代码有问题(内存泄漏):
char* data = (char*) malloc(10);
data="123456789[=10=]";
应该是:
char* data = (char*) malloc(10);
strcpy(data, "123456789");
这也意味着您无法说明 data
中指针的对齐方式,而 malloc()
中的赋值保证数据对于任何基本类型都充分对齐。
但是,这与接下来两行的问题部分无关:
const char *m_data = (const char *)data;
uint32_t i32 = *((uint32_t*)m_data);
第一行中的转换是不必要的,但没有害处。下一行将存储在 m_data
中的指针视为 uint32_t
指针,取消引用它,并将结果分配给 i32
。如果 m_data
中的值来自 data
,而 data
来自 malloc()
,数据将充分对齐,这不会成为问题。对于字符串赋值,不能保证 m_data
中的指针足够对齐以用作 uint32_t
指针。所以一切都可能会崩溃,或者你可能会没事。由于内存泄漏,行为未定义。
NS()
函数字节交换一个 16 位整数。 NL()
函数在 32 位整数中交换 16 位值。这意味着您从 'Start' 图表中显示的值开始,并以 'Finish' 图表中显示的值结束。
+------+------+------+------+
| MSB | NMSB | NLSB | LSB | Start
+------+------+------+------+
+------+------+------+------+
| LSB | NLSB | NMSB | MSB | Finish
+------+------+------+------+
m_data += 4u;
将指针m_data
加4,所以不是指向字符串的1
,而是指向5
.
当 NS
被赋予一个 16 位值时 i16
因此(每个字符为一位):
aaaaaaaabbbbbbbb
然后表达式 i16 << 8
(向左移动 8 位,向右输入零位)将得到 bbbbbbbb00000000
,i16 >> 8
将得到 00000000aaaaaaaa
.将它们组合在一起得到:
bbbbbbbb00000000
OR 00000000aaaaaaaa
----------------
bbbbbbbbaaaaaaaa
换句话说,就是交换两个字节。
同上 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
添加到字符指针,使其前进到 next 32 位值(在 "5678"
)。
我阅读了下面的一些代码:
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;
和函数NS和NL。
有人可以告诉我吗?
uint32_t i32 = *((uint32_t*)m_data);
这字面意思是将指针 m_data
解释为指向 uint32_t
的指针并解引用它。目的是将 data
指定的字符解释为 uint32_t
.
函数 NS 和 NL 似乎是对其参数的左右半部分进行按位或运算并返回它。
m_data += 4u;
这应该等同于没有 unsigned 后缀的相同语句。它只是递增指针 m_data
以指向其之前指向的地址上方四个字符处的字符。
代码有问题(内存泄漏):
char* data = (char*) malloc(10);
data="123456789[=10=]";
应该是:
char* data = (char*) malloc(10);
strcpy(data, "123456789");
这也意味着您无法说明 data
中指针的对齐方式,而 malloc()
中的赋值保证数据对于任何基本类型都充分对齐。
但是,这与接下来两行的问题部分无关:
const char *m_data = (const char *)data;
uint32_t i32 = *((uint32_t*)m_data);
第一行中的转换是不必要的,但没有害处。下一行将存储在 m_data
中的指针视为 uint32_t
指针,取消引用它,并将结果分配给 i32
。如果 m_data
中的值来自 data
,而 data
来自 malloc()
,数据将充分对齐,这不会成为问题。对于字符串赋值,不能保证 m_data
中的指针足够对齐以用作 uint32_t
指针。所以一切都可能会崩溃,或者你可能会没事。由于内存泄漏,行为未定义。
NS()
函数字节交换一个 16 位整数。 NL()
函数在 32 位整数中交换 16 位值。这意味着您从 'Start' 图表中显示的值开始,并以 'Finish' 图表中显示的值结束。
+------+------+------+------+
| MSB | NMSB | NLSB | LSB | Start
+------+------+------+------+
+------+------+------+------+
| LSB | NLSB | NMSB | MSB | Finish
+------+------+------+------+
m_data += 4u;
将指针m_data
加4,所以不是指向字符串的1
,而是指向5
.
当 NS
被赋予一个 16 位值时 i16
因此(每个字符为一位):
aaaaaaaabbbbbbbb
然后表达式 i16 << 8
(向左移动 8 位,向右输入零位)将得到 bbbbbbbb00000000
,i16 >> 8
将得到 00000000aaaaaaaa
.将它们组合在一起得到:
bbbbbbbb00000000
OR 00000000aaaaaaaa
----------------
bbbbbbbbaaaaaaaa
换句话说,就是交换两个字节。
同上 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
添加到字符指针,使其前进到 next 32 位值(在 "5678"
)。