Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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++培训来工作。到目前为止还不错,但我需要一些帮助来强化我正在学习的一些概念。我的问题是如何可视化我创建的对象的字节模式。例如,如何打印struct、long、int等的字节模式_C++_C - Fatal编程技术网

如何使用C/C++; 我正在通过一些C++培训来工作。到目前为止还不错,但我需要一些帮助来强化我正在学习的一些概念。我的问题是如何可视化我创建的对象的字节模式。例如,如何打印struct、long、int等的字节模式

如何使用C/C++; 我正在通过一些C++培训来工作。到目前为止还不错,但我需要一些帮助来强化我正在学习的一些概念。我的问题是如何可视化我创建的对象的字节模式。例如,如何打印struct、long、int等的字节模式,c++,c,C++,C,我在头脑中理解它,也能理解我学习材料中的图表,我只是希望能够在我的一些学习程序中以编程方式显示字节模式 我意识到这很琐碎,但任何答案都将极大地帮助我深入了解这些概念 谢谢 编辑:我的其他开发项目大多使用XCode,但有Windows7和fedora core的虚拟机。在工作中,我将XP与VisualStudio2005结合使用。 (我无法评论,因为我在这里仍然是n00b:D) 我使用了unwind的解决方案,这正是我所寻找的。我也在想,也许我可以使用dos调试命令,因为我也想看看内存块。同样,这

我在头脑中理解它,也能理解我学习材料中的图表,我只是希望能够在我的一些学习程序中以编程方式显示字节模式

我意识到这很琐碎,但任何答案都将极大地帮助我深入了解这些概念

谢谢

编辑:我的其他开发项目大多使用XCode,但有Windows7和fedora core的虚拟机。在工作中,我将XP与VisualStudio2005结合使用。 (我无法评论,因为我在这里仍然是n00b:D)


我使用了unwind的解决方案,这正是我所寻找的。我也在想,也许我可以使用dos调试命令,因为我也想看看内存块。同样,这只是为了帮助我巩固我所学的东西。再次感谢大家

您可以使用这样的函数来打印字节:

static void print_bytes(const void *object, size_t size)
{
#ifdef __cplusplus
  const unsigned char * const bytes = static_cast<const unsigned char *>(object);
#else // __cplusplus
  const unsigned char * const bytes = object;
#endif // __cplusplus

  size_t i;

  printf("[ ");
  for(i = 0; i < size; i++)
  {
    printf("%02x ", bytes[i]);
  }
  printf("]\n");
}
这将字节显示为原始数字值,以十六进制表示,通常用于此类“内存转储”

在运行“Intel(R)Xeon(R)”CPU的随机(据我所知,甚至可能是虚拟)Linux机器上,这会打印:

[ 25 00 00 00 ] [ c3 f5 48 40 ] [ 25 00 00 00 ] [c3 f5 48 40] 这也很方便地证明了Intel系列CPU:s的真正价值。

试试这个:

MyClass* myObj = new MyClass();
int size=sizeof(*myObj);
int i;
char* ptr = obj; // closest approximation to byte
for( i=0; i<size; i++ )
    std::cout << *ptr << endl;
MyClass*myObj=newmyclass();
int size=sizeof(*myObj);
int i;
char*ptr=obj;//最接近字节

对于(i=0;i如果您使用gcc和X,您可以使用来为您的数据结构绘制漂亮的图片。

或者如果您有boost库并希望使用lambda求值,您可以这样做

template<class T>
void bytePattern( const T& object )
{
    typedef unsigned char byte_type;
    typedef const byte_type* iterator;

    std::cout << "Object type:" << typeid( T ).name() << std::hex;
    std::for_each( 
        reinterpret_cast<iterator>(&object), 
        reinterpret_cast<iterator>(&object) + sizeof(T), 
        std::cout << constant(' ') << ll_static_cast<int>(_1 )&&0xFF );   
    std::cout << "\n";
}
模板
void bytePattern(常量T和对象)
{
typedef无符号字符字节\ u类型;
typedef const byte_type*迭代器;

std::cout大多数(可视化)调试器都有“查看内存”选项。Xcode中的IIRC非常基本,只是以十六进制和ASCII显示字节,行长可变。visual Studio(调试->Windows->Vs2008中的内存)可以将十六进制部分格式化为不同的整数长度或浮点,更改尾数,并显示ANSI或UNICODE文本。您还可以设置窗口宽度的任意数字(我认为xcode只允许您设置为64字节宽)我在这里工作的其他IDE有很多选择,虽然与完整性无关,但与V/P > > P>不太多,C++示例:

#include <iostream>

template <typename T>
void print_bytes(const T& input, std::ostream& os = std::cout)
{
  const unsigned char* p = reinterpret_cast<const unsigned char*>(&input);
  os << std::hex << std::showbase;
  os << "[";
  for (unsigned int i=0; i<sizeof(T); ++i)
    os << static_cast<int>(*(p++)) << " ";
  os << "]" << std::endl;;
}

int main()
{
  int i = 12345678;
  print_bytes(i);
  float x = 3.14f;
  print_bytes(x);
}
#包括
模板
无效打印字节(常量T和输入,std::ostream&os=std::cout)
{
const unsigned char*p=重新解释强制转换(&input);

操作系统我一点一点地编写了一个控制台程序,希望它能帮助别人

#include <iostream>
#include <inttypes.h>
#include <vector>
using namespace std;
typedef  vector<uint8_t> ByteVector;
///////////////////////////////////////////////////////////////
uint8_t Flags[8] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void print_bytes(ByteVector Bv){
    for (unsigned i = 0; i < Bv.size(); i++){
        printf("Byte %d [ ",i);
        for (int j  = 0;j < 8;++j){
            Bv[i] & Flags[j] ? printf("1") : printf("0");
        }
        printf("]\n");
    }
}
int main(){
    ByteVector Bv;
    for (int i = 0; i < 4; ++i) { Bv.push_back(i); }
    print_bytes(Bv);
}
#包括
#包括
#包括
使用名称空间std;
typedef向量字节向量;
///////////////////////////////////////////////////////////////
uint8_t标志[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
无效打印字节(字节向量Bv){
for(无符号i=0;i
您需要解释您的T环境(编译器、调试器(如果您有)、操作系统等)。您是指调试器信息,以便在运行时可以在内存中看到加载的对象吗?是的,调试器信息将是grand.char*ptr=reinterpret\u cast(myObj);而且endl可能需要一个std::Prefixdd,它实际上具有很好的可视化效果。当你想看到一个复杂的数据结构时,它非常棒。见鬼,在DDD中,即使是链表也很好。你没有提到你的示例中有哪些部分来自Boost。Lambda,没有经验的程序员可能很难解码。现在我们开始:Boost::Lambda::ll_static_cast,boost::lambda::_1非常感谢你much@user1721803因为您不能取消引用
void*”。我认为这样的函数更干净,因为这使得*使用函数非常简单,强制转换更少。强制转换要避免,最好在需要的地方包含它们,而不是将它们强加给其他函数s、 @unwind为什么要按位和每个字节使用
0xff
?有必要吗?@JoãoAlmeida不,不应该这样。我想这只是一种皮带和吊杆的想法。这是我不喜欢的,所以我现在就编辑它。谢谢。错误:从“const void*”到“const unsigned char*”的无效转换[-fpermissive]常量无符号字符*常量字节=对象;
#include <iostream>
#include <inttypes.h>
#include <vector>
using namespace std;
typedef  vector<uint8_t> ByteVector;
///////////////////////////////////////////////////////////////
uint8_t Flags[8] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void print_bytes(ByteVector Bv){
    for (unsigned i = 0; i < Bv.size(); i++){
        printf("Byte %d [ ",i);
        for (int j  = 0;j < 8;++j){
            Bv[i] & Flags[j] ? printf("1") : printf("0");
        }
        printf("]\n");
    }
}
int main(){
    ByteVector Bv;
    for (int i = 0; i < 4; ++i) { Bv.push_back(i); }
    print_bytes(Bv);
}