将char []与随机char元素转换为一个int

时间:2016-05-07 07:54:22

标签: c++

我一直在尝试使用C ++读取STL文件中的二进制数据。我在网上找到了一些方法,其中包括一个我无法理解的程序:

function getColumns() {
  return $.getJSON("http://myjsonurl");
}

getColumns().then(function(json) {
  console.log(JSON.stringify(json.columns))
}
// handle errors
, function err(jqxhr, textStatus, errorThrown) { 
    console.log(textStatus, errorThrown)
}; 

据我所知,每个 char 都可以通过它们的ASCII号转换为 int ,但我不知道 char 的数组是怎样的转换为一个 int

char f1[4] = { facet[0],facet[1],facet[2],facet[3] };
float xx = *((float*)f1); 

此转换背后的原因是什么?是什么使一个char foo[3] = { 'a','b','c' }; int x = (int)foo; /*x is now 6513249*/ /*And the char[] can be converted into float as well*/ 成为特定的int或float?

1 个答案:

答案 0 :(得分:4)

让我们分别举两个例子:

char f1[4] = { facet[0],facet[1],facet[2],facet[3] };

这声明了一个包含四个char的数组,并为它们提供了一些值。

f1

作为一个表达式,这是#34;四个char元素的数组",但在大多数情况下,它会衰减为"指向char" (到第一个元素)。

((float*)f1)

这会将"指针转换为char"进入"指向float"的指针。它产生一个指针,编译器已经告诉它指向内存中的浮点数(尽管实际上它指向一个char数组)。这也可以写成:

reinterpret_cast<float*>(f1)

这使得狡猾的事情变得更加明显。

*((float*)f1)

这通过指针间接,并将四个字符视为浮点数。它非常靠近 strict-aliasing 规则的边缘,我认为它跨过它们。避免使用这种代码。 (除了严格的别名规则之外,如果CPU需要对齐浮点变量,并且char数组没有适当对齐),它也会崩溃。

float xx = *((float*)f1); 

最后,这声明了一个浮点变量,并为它指定了我们上面计算的值。这可能会产生xx中的陷阱值。

您可以通过以下方式避免大部分危险:

char f1[4] = { facet[0],facet[1],facet[2],facet[3] };
float xx;
memcpy(&xx, f1, 4);

这将f1中的四个字节复制到xx的内存中。它仍然可以是陷阱值,但至少它不会违反严格的别名规则,或者不对齐。

char foo[3] = { 'a','b','c' };
int x = (int)foo;

这简单得多。它将foo的地址转换为int,并将int存储在x中。这个可以有用,但通常不是(特别是int在64位应用程序中通常不够大。)