相关疑难解决方法(0)

在内存中复制字节时,字节顺序是否有效?

我是否正确地认为,只有当我们谈论如何存储一个值并且在复制内存时不相关时,endianess才有意义?

例如

如果我有一个值0xf2fe0000并将其存储小端系统上-字节获取存储在顺序00,00,fef2.但大端系统上的字节获取存储f2,fe,0000.

现在-如果我只是想这4个字节到其他4个字节复制(在同一系统),小端系统上我该拿含其它4个字节来结束00,00,fef2 按此顺序

或者在内存中复制这些字节时,字节顺序是否有效?

c c++ memory

4
推荐指数
1
解决办法
955
查看次数

如何解释*((char*)&a)

我看到一种方法来了解平台的字节顺序是这个程序,但我不明白

#include <stdio.h>
int main(void)
{
  int a = 1;
  if( *( (char*)&a ) == 1) printf("Little Endian\n");
  else printf("Big Endian\n");
  system("PAUSE");  
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

测试做了什么?

c endianness

4
推荐指数
1
解决办法
304
查看次数

将数字转换为字节数组

嗨,我有一个基数为10的数字,例如3198,十六进制表示为0x0C7E

如何将该数字转换为十六进制并将该十六进制值以[00] [0C] [7E]的格式放入字节数组中,假设我可以拥有的最大十六进制值是0xffffff.

c

3
推荐指数
1
解决办法
5906
查看次数

输入惩罚 - 编译器如何决定使用哪种类型?

我在这里读到这个关于决定字节序的问题,第一个答案让我感到困惑.

用于决定大字节序的代码如下:

int is_big_endian(void)
{
    union {
        uint32_t i;
        char c[4];
    } bint = {0x01020304};

    return bint.c[0] == 1; 
} 
Run Code Online (Sandbox Code Playgroud)

我的问题是这里的编译器如何决定用于该十六进制数字数组类型?因为从技术上讲它同样适用于那个uint32_t或那个char[4].

为什么不把它存放在char[4]跳过union

这里有一些union我看不到的优势吗?我知道这被称为打字,但我没有看到它的优势.

c++ unions type-punning

3
推荐指数
1
解决办法
180
查看次数

大端还是小端?

可能重复:
如何检查系统是大端还是小端?

如何知道机器使用的是大端还是小端?有没有我可以写的代码呢?

c objective-c

2
推荐指数
1
解决办法
4669
查看次数

确定A系统是否使用C使用Big Endian或Little Endian

我很好奇这个函数是否会决定字节序.

如果整数someInt存储在little endian中,则测试是一个等于1的位掩码.

在位掩码中,将0x1000转换为匹配机器的endian样式还是"常量"?

#include <stdio.h>

int isBigEndian(){
    int someInt =0x0001;
    if(someInt & 0x0100 == 1) 
        return 1;
    else 
        return 0;
}

int main(){
    int returnVal = isBigEndian();
    printf("return val is %d", returnVal);
}
Run Code Online (Sandbox Code Playgroud)

c hex endianness

2
推荐指数
1
解决办法
2325
查看次数

这段代码是真的知道系统是小端还是大端?

#include<stdio.h>
int main()                                                                                                                              
{
    unsigned int unum = 0x80008001;
    short unsigned int *snum = (short unsigned int*)&unum;
    printf("%d\n", *snum);
    printf("%d\n", *(snum+1));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

32769
32768
Run Code Online (Sandbox Code Playgroud)

snum指向unum的最初两个字节,但是它的值是unum的最后两个字节,并且在递增指针之后,value是unum的前两个字节.

所以,它是一个小端系统.但是,我不确定这种方式是否正确,以了解系统的类型.这是对的吗?

c endianness

2
推荐指数
1
解决办法
125
查看次数

这与endian-ness有什么关系吗?

对于此代码:

#include<stdio.h>

void hello() { printf("hello\n"); }
void bye()   { printf("bye\n");   }

int main() {
    printf("%p\n", hello); 
    printf("%p\n", bye);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我机器上的输出:

0x80483f4
0x8048408
Run Code Online (Sandbox Code Playgroud)

[第二个地址价值更大]

键盘上

0x8048541
0x8048511
Run Code Online (Sandbox Code Playgroud)

[第二个地址的价值较小]

这与机器的字节序有什么关系吗?如果不,

  • 为什么地址排序有所不同?

  • 另外,为什么区别差异?

    0x8048541 - 0x8048511 = 0x30

    0x8048408 - 0x80483f4 = 0x14


顺便说一下,我刚检查过.这段代码(取自这里)说这两台机器都是Little-Endian

#include<stdio.h>
int main() {    
    int num = 1; 
    if(*(char *)&num == 1)
        printf("Little-Endian\n");
    else    
        printf("Big-Endian\n");
    return 0;       
}
Run Code Online (Sandbox Code Playgroud)

c c++ memory-management function-pointers endianness

1
推荐指数
2
解决办法
309
查看次数

C++编写int缓冲区

我正在尝试将一个int数组写入fstream,但是当我调用时,我得到了一个异常fstream.write.

我可以fstream用来将int数组写入文件吗?

int main(int argc, char * argv[])
{
    fstream amostra("D:\\Amostra.txt", ios::out | ios::binary);
    const int total_elements_block = 1024;
    const int buffer_size  = total_elements_block;

    const int total_buffer = 10;

    int * buffer = new int [buffer_size];
    //for (int j=0; j<total_buffer; j++){
        for (int i =0; i<total_elements_block; i++){
            buffer[i] = i;
        }
        amostra.write((char *)(&buffer), total_elements_block*4);
    //}

    amostra.close();
    delete []buffer;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ buffer

1
推荐指数
2
解决办法
4111
查看次数

复制关于endianess的整数内容

我想要做的事实上应该很简单,但我不知道如何以一种简单的方式实现它:

我想将无符号整数(32位)的值复制到无符号字符数组.数组中的表示必须始终为little endian.

在一个小端架构上我可以简单地做:

unsigned char array[sizeof(unsigned int)];
unsigned int i = 12345;
memcpy(array, &i, sizeof(unsigned int));
Run Code Online (Sandbox Code Playgroud)

该表示将以小尾数表示.在大端架构上实现这一目标的最佳方法是什么?我如何在我的代码中找出我的架构的endianess?

我的项目使用C++ 11标准.

提前致谢!

c c++ c++11

1
推荐指数
1
解决办法
163
查看次数

如何检测系统上的字节序

如何在java中检测系统上的字节序?我不想使用内置方法作为面试问题.如何将大到小转换,反之亦然?

我正在寻找使用Java而不是C/C++的ans.我找到了这样的链接 在C++程序中以编程方式检测字节序

java algorithm endianness

0
推荐指数
1
解决办法
387
查看次数

如何为包含32位的位字段分配32位无符号整数

我试图创建一个具有32位总位数的位域结构,但是当我尝试为其分配32位数字时,出现此错误:

从'unsigned int'到位字段的隐式截断将值从4278190080更改为0

这是我的结构以及如何使用它

struct Color32 {
    uint32_t a : 8;
    uint32_t r : 8;
    uint32_t g : 8;
    uint32_t b : 8;
};


Color32 BLACK = {0xFF000000}; // this line has the compilation error
Run Code Online (Sandbox Code Playgroud)

我看到了有关位字段分配的其他问题,但它们似乎都使用按位运算来设置各个字段。

还有一个具有以下示例的参考,似乎与我使用它的方式相同,只有我自己不会编译:

#include <iostream>
struct S {
 // three-bit unsigned field,
 // allowed values are 0...7
 unsigned int b : 3;
};
int main()
{
    S s = {6};
    ++s.b; // store the value 7 in the bit field …
Run Code Online (Sandbox Code Playgroud)

c++ bit-fields

-2
推荐指数
2
解决办法
175
查看次数