Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的4个字符到int+;_C++_Int_Arrays - Fatal编程技术网

C++ c+中的4个字符到int+;

C++ c+中的4个字符到int+;,c++,int,arrays,C++,Int,Arrays,我必须从文件中读取10个字节,最后4个字节是无符号整数。但是我得到了一个11个字符字节长的字符数组/指针。如何将最后4个字节(末尾没有零终止字符)转换为无符号整数 //pesudo code char *p = readBytesFromFile(); unsigned int myInt = 0; for( int i = 6; i < 10; i++ ) myInt += (int)p[i]; //pesudo代码 char*p=readBytesFromFile(); 无符

我必须从文件中读取10个字节,最后4个字节是无符号整数。但是我得到了一个11个字符字节长的字符数组/指针。如何将最后4个字节(末尾没有零终止字符)转换为无符号整数

//pesudo code
char *p = readBytesFromFile();
unsigned int myInt = 0;
for( int i = 6; i < 10; i++ )
    myInt += (int)p[i];
//pesudo代码
char*p=readBytesFromFile();
无符号整数myInt=0;
对于(int i=6;i<10;i++)
myInt+=(int)p[i];
对吗?对我来说似乎不正确

Try
myInt=*(重新解释(p+6))

这将获取第6个字符的地址,将其重新解释为指向无符号int的指针,然后返回它所指向的(无符号int)值。

Try
myInt=*(reinterpret_cast(p+6))


这将获取第6个字符的地址,将其重新解释为指向无符号int的指针,然后返回它所指向的(无符号int)值。

我同意前面的答案,但只想补充一点,如果使用不同的endianness创建文件,此解决方案可能无法100%工作

我不想用额外的信息来迷惑你们,但请记住,当你们直接从一个文件中强制转换时,endianness可能会给你们带来问题


这里有一个关于endianness的教程:

我同意前面的答案,但只想补充一点,如果文件是用不同的endianness创建的,这个解决方案可能无法100%工作

我不想用额外的信息来迷惑你们,但请记住,当你们直接从一个文件中强制转换时,endianness可能会给你们带来问题

这里有一个关于endianness的教程:

以下代码可能有效:

这是对齐安全的(应该在每个系统上)。仍然要注意第1点和第3点。

以下代码可能有效:


这是对齐安全的(应该在每个系统上)。仍然要注意第1点和第3点。

也许可以选择使用工会?我认为这可能有效; 更新:是的,它可以工作

union intc32{
charc[4];
INTV;
};
int charsToInt(字符a、字符b、字符c、字符d){
intc32 r={{a,b,c,d};
返回r.v;
}

也许可以选择使用工会?我认为这可能有效; 更新:是的,它可以工作

union intc32{
charc[4];
INTV;
};
int charsToInt(字符a、字符b、字符c、字符d){
intc32 r={{a,b,c,d};
返回r.v;
}

使用
memcpy
<代码>*(int*)(p+6)
(1)可能会遇到对齐问题,(2)违反严格的别名。Endianness也可能是一个问题。您需要将不同字节的位移到适当的位置。取决于传输值的结束度。循环中的赋值可以是
myInt=myInt-Guys,这些都应该被做成答案,而不是注释。使用
memcpy
<代码>*(int*)(p+6)
(1)可能会遇到对齐问题,(2)违反严格的别名。Endianness也可能是一个问题。您需要将不同字节的位移到适当的位置。取决于传输值的结束度。循环中的赋值可能是
myInt=myInt-Guys,这些都应该被做成答案,而不是注释。这对于endianness来说可能是危险的,因为没有
unsigned int
变量可以查看。我们正在研究任意内存,它需要一个指针<由于这个原因,代码>重新解释\u cast只能在指针上工作。这对于Endianness可能是危险的,因为没有可查看的
无符号int
变量。我们正在研究任意内存,它需要一个指针<由于这个原因,代码>重新解释\u cast
只能在指针上工作。严格的别名。无法通过类型为unsigned int的glvalue访问一组字符的存储值。另一个不这样做的原因是严格别名。您不能通过类型为unsigned int的glvalue访问一组字符的存储值。不这样做的另一个原因。
myInt = *(reinterpret_cast<unsigned int*>(p + 6));
myInt = myInt << 8 | static_cast<unsigned char>(p[i])