C++ 不简单,从字符转换long-long[8]
我得到了一个具有8个位置的字符数组(字符数据[8];),这个数组上有一个无符号长整型值(大小为8字节)。。。数据[0]具有long int的第一个字节,数据[1]具有第二个字节,依此类推。 我的问题是如何在无符号长变量上再次输入该值 我尝试过移位,但值不等于原始值,如何在不更改原始数组的情况下执行此操作 字节的顺序是小端变量的正常顺序(从高位到低位) 下面是一段代码,它打印的值与预期值不同C++ 不简单,从字符转换long-long[8],c++,types,C++,Types,我得到了一个具有8个位置的字符数组(字符数据[8];),这个数组上有一个无符号长整型值(大小为8字节)。。。数据[0]具有long int的第一个字节,数据[1]具有第二个字节,依此类推。 我的问题是如何在无符号长变量上再次输入该值 我尝试过移位,但值不等于原始值,如何在不更改原始数组的情况下执行此操作 字节的顺序是小端变量的正常顺序(从高位到低位) 下面是一段代码,它打印的值与预期值不同 char vec[8]={0,0,0,0,0,0,0,1}; unsigned long long va
char vec[8]={0,0,0,0,0,0,0,1};
unsigned long long value = *((unsigned long long*) vec);
std::cout<<value;
return 0;
charvec[8]={0,0,0,0,0,0,1};
无符号长值=*((无符号长*)向量);
std::cout您可以执行以下操作:
unsigned long long value = *((unsigned long long*) data);
但前提是:
数据
正确对齐,可以作为长
访问。例如,如果long-long
需要8字节对齐,但data
只有4字节对齐,那么它可能会做坏事
数据的字节
存储顺序与当前机器的long
字节顺序相同。看
假设数据
数组的字节顺序与生成的long
值相同
unsigned long long ll;
assert(sizeof ll == sizeof data);
memcpy(&ll, data, sizeof ll);
避免基于cast的解决方案。它们违反了严格的别名语义,因此不能保证工作。直接强制转换可能无法工作,具体取决于硬件表示,这在大多数情况下都应该有效:
long long to_llong(unsigned char *data) {
long long v = 0;
for (int i = 0; i < 8; i++) {
v = (v << 8) | data[i];
}
return v;
}
long-long-to-llong(无符号字符*数据){
长v=0;
对于(int i=0;i<8;i++){
v=(v你说第一个字节是什么意思?它是最低有效字节还是最高有效字节
这个问题的答案决定了数值是小端还是大端
如果值的endian样式与您的系统相同,您可以直接将第一个字节的地址强制转换为“unsigned long long*”,而如果不相同,则必须转换其endian样式。这里解释了严格的别名,以防万一:这也不起作用,此代码的输出是72057594037927936字符数据[8]={0,0,0,0,0,0,0,1}@user1553386:正如我所说,只有在字节顺序相同的情况下,此代码才会起作用。在little endian平台和big endian平台上,您的字节数组数据表示值72057594037927936
。您需要决定使用哪个平台,并相应地采取行动。问题要求未签名。此外,s签名溢出可能会有副作用。@LuchianGrigore:您如何使其不那么冗长?(但它仍然会受到对齐和结尾问题的影响。)@LuchianGrigore:您要查找的标记是--但它无论如何在注释中都不起作用。我真的想知道(所有)这种方法的缺陷。如果有人能编辑我的帖子,或者写一个包含潜在问题参考的答案,我将不胜感激。我听说过结构中的对齐,但我不知道如何在这里应用。AndreyT提到了别名问题,但在一份由SO答案链接的白皮书中,答案似乎与此无关无符号long-long
值的“第一”字节可以是最高有效或最低有效。您说您“尝试了移位”;请向我们展示您的实际代码以及一些示例输入和输出。@user1553386:“Little endian”“意味着最低有效字节首先位于内存中,这意味着在数组中最低有效字节必须位于第一位。在little endian平台的内存中,值1
由字节数组{1,0,0,0,0,0,0,0,0,0}表示。”
。您的示例中的数组确实代表了它应该代表的72057594037927936
。代码应该是这样工作的。您可能误解了little endian是什么,或者实际上需要big endian。