Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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+中将十六进制值的字符数组转换为单个整数值+;?_C++_Arrays_Char_Hex - Fatal编程技术网

C++ 如何在c+中将十六进制值的字符数组转换为单个整数值+;?

C++ 如何在c+中将十六进制值的字符数组转换为单个整数值+;?,c++,arrays,char,hex,C++,Arrays,Char,Hex,我有一个十六进制值的字符数组,我想把它们转换成一个整数值。我目前使用的代码有两个问题: 问题1:运行此命令后存储在strHex中的值是“0927FFFFC0”,而我希望它是“000927C0”-添加额外“ffffff”的原因是什么 问题2:如果可能的话,我想要一个解决方案,将十六进制值的字符数组转换为整数,而不使用stringstream char cArray[4] = { 0x00, 0x09, 0x27, 0xC0 }; // (600000 in decimal) std::strin

我有一个十六进制值的字符数组,我想把它们转换成一个整数值。我目前使用的代码有两个问题:

问题1:运行此命令后存储在strHex中的值是“0927FFFFC0”,而我希望它是“000927C0”-添加额外“ffffff”的原因是什么

问题2:如果可能的话,我想要一个解决方案,将十六进制值的字符数组转换为整数,而不使用stringstream

char cArray[4] = { 0x00, 0x09, 0x27, 0xC0 }; // (600000 in decimal)

std::stringstream ss;
for (int i = 0; i < 4; ++i)
{
    ss << std::hex << (int)cArray[i];
}
std::string strHex = ss.str();

int nHexNumber;
sscanf(strHex.c_str(), "%x", &nHexNumber);
char cArray[4]={0x00、0x09、0x27、0xC0};//(十进制为600000)
std::stringstream-ss;
对于(int i=0;i<4;++i)
{
党卫军
在Windows上的Ubuntu下:

leus@owl:~$ uname -a
Linux owl 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 x86_64 x86_64 x86_64 GNU/Linux
leus@owl:~$ ./a.out
927c0
leus@owl:~$
在Windows上的Ubuntu下:

leus@owl:~$ uname -a
Linux owl 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 x86_64 x86_64 x86_64 GNU/Linux
leus@owl:~$ ./a.out
927c0
leus@owl:~$
#包括
#包括
使用名称空间std;
联合{
无符号字符cA[4]={0x00,0x09,0x27,0xc0};
int k;
}u;
int main()
{
不能包含
#包括
使用名称空间std;
联合{
无符号字符cA[4]={0x00,0x09,0x27,0xc0};
int k;
}u;
int main()
{


请只标记正在使用的语言。初始化的“十六进制值”是不相关的-每个元素都是
char
,但是
unsigned char
更好。使用
unsigned char
而不是
char
为什么说{0,9,39,192}是“600000”十进制?当强制转换为
int
时,您是在对值进行符号扩展。0xC0在二进制中是
10100000
。显然
char
被认为是有符号类型,因此当扩展它以适合您的4字节
int
类型时,它会为其预先添加一组
1
以保留值,而不是变成负数通过零扩展将er转换为正数。请仅标记正在使用的语言。初始化的“十六进制值”是不相关的-每个元素都是
char
,但是
无符号char
会更好。使用
无符号char
而不是
char
为什么说{0,9,39,192}是“600000”十进制?当强制转换为
int
时,您是在对值进行符号扩展。0xC0在二进制中是
10100000
。显然
char
被认为是有符号类型,因此当扩展它以适合您的4字节
int
类型时,它会为其预先添加一组
1
以保留值,而不是变成负数通过零扩展将er转换为正数。此解决方案不依赖于endianness。但如果
int
为16位,或者
cArray[0]
的高位为
1
,则这将是未定义的行为。第一个字节为1,或者
int
为16位(或64位,就这一点而言),这一点很好.但是为什么你说这是endian安全的呢?不管系统的endian是什么,它都会产生相同的结果。我不是把第一个字节放在第四个位置,然后第二个放在第三个位置,第三个放在第二个位置,最后一个放在第一个位置吗?怎么会产生的四个字节不跟最后一个最高有效字节排序?你是creat输入值
600000
(十进制),而不考虑其表示形式。在32位+系统的任何端点上,该代码都具有相同的输出。此解决方案不依赖于端点。但如果
int
为16位,或
cArray[0]的高位,则该行为将是未定义的
1
。第一个字节是1,或者
int
是16位(或者64位),这是一个很好的观点.但是为什么你说这是endian安全的呢?不管系统的endian是什么,它都会产生相同的结果。我不是把第一个字节放在第四个位置,然后第二个放在第三个位置,第三个放在第二个位置,最后一个放在第一个位置吗?怎么会产生的四个字节不跟最后一个最高有效字节排序?你是crea输入值
600000
(十进制)无论是表示还是代码,代码在32位+系统C++的任何一个字节上都有相同的输出,读取未写入最后一个成员的联合成员的行为是不明确的。也就是,代码> HtNLL < /C>不是标准C++的一部分,那么您能将这个代码变成一个完整的代码吗?说它不起作用。另一个贴出的答案已接近完成。你可以阅读你自己的链接吗?它支持我在第一条评论中所说的。工会成员的生命周期从该成员激活时开始。如果另一个成员之前激活过,则其生命周期结束
cA
由于初始化而处于活动状态,
k
处于非活动状态,因此您在变量的生存期之外读取变量。另请参见页面的第一行,“联合是一种特殊的类类型,一次只能保存其一个非静态数据成员。”这是一个基本的联盟用法。实际上,我不知道任何编译器会产生未定义的行为。你能说出一个吗?在C++中,读取一个不是最后一个写的联合成员的行为是不明确的。也就是说,代码> HtnL不是标准C++的一部分,那么你能把这个代码变成一个完整的代码吗?最好是有效率的建议。ce不仅仅是说它不起作用。另一个贴出的答案已经接近完整了。你可以阅读你自己的链接吗?它支持我在第一条评论中所说的。工会成员的生命周期从该成员被激活时开始。如果另一个成员以前是激活的,则其生命周期结束
cA
由于初始化而处于活动状态,
k
处于非活动状态,因此您在变量的生存期之外读取变量。另请参见页面的第一行,“联合是一种特殊的类类型,一次只能保存其一个非静态数据成员。”这是一个基本的联合用法。事实上,我不知道任何编译器会生成未定义的行为。你能说出一个吗?
leus@owl:~$ uname -a
Linux owl 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 x86_64 x86_64 x86_64 GNU/Linux
leus@owl:~$ ./a.out
927c0
leus@owl:~$
#include<arpa/inet.h>
#include<iostream>
using namespace std;

union {
    unsigned char cA[4] = { 0x00, 0x09, 0x27, 0xc0 };
    int k;
} u;

int main() 
{
    cout << htonl(u.k) << endl;
}