Suppose I do a
假设我做一个
double d = 234.5;
I want to see the memory contents of d
[the whole 8 bytes]
我想看看d的内存内容[整个8字节]
How do I do that?
我该怎么做呢?
9 个解决方案
#1
20
double d = 234.5;
/* 1. use a union */
union u {
double d;
unsigned char c[sizeof(double)];
};
union u tmp;
size_t i;
tmp.d = d;
for (i=0; i < sizeof(double); ++i)
printf("%02x\n", tmp.c[i]);
/* 2. memcpy */
unsigned char data[sizeof d];
size_t i;
memcpy(data, &d, sizeof d);
for (i=0; i < sizeof d; ++i)
printf("%02x\n", data[i]);
/* 3. Use a pointer to an unsigned char to examine the bytes */
unsigned char *p = (unsigned char *)&d;
size_t i;
for (i=0; i < sizeof d; ++i)
printf("%02x\n", p[i]);
All the methods show you the bytes—but the same double
value may print the bytes differently on different systems, e.g., due to different encodings (rare), or different endianness.
所有方法都向您显示字节——但是相同的double值可能会在不同的系统上以不同的方式打印字节,例如,由于不同的编码(罕见)或不同的意外发现。
#2
26
unsigned char *p = (unsigned char *)&d;
int i;
for (i = 0; i < sizeof d; i++)
printf("%02x ", p[i]);
#3
7
Courtesy of my library of useful snippets, here's a solution in C, complete with test harness, and providing both hex and ASCII data:
在我的有用代码库的帮助下,这里有一个C语言的解决方案,包含了测试工具,并提供了十六进制和ASCII数据:
#include <stdio.h>
void hexDump (char *desc, void *addr, int len) {
int i;
unsigned char buff[17]; // stores the ASCII data
unsigned char *pc = addr; // cast to make the code cleaner.
// Output description if given.
if (desc != NULL)
printf ("%s:\n", desc);
// Process every byte in the data.
for (i = 0; i < len; i++) {
// Multiple of 16 means new line (with line offset).
if ((i % 16) == 0) {
// Just don't print ASCII for the zeroth line.
if (i != 0)
printf (" %s\n", buff);
// Output the offset.
printf (" %04x ", i);
}
// Now the hex code for the specific character.
printf (" %02x", pc[i]);
// And store a printable ASCII character for later.
if ((pc[i] < 0x20) || (pc[i] > 0x7e))
buff[i % 16] = '.';
else
buff[i % 16] = pc[i];
buff[(i % 16) + 1] = '\0';
}
// Pad out last line if not exactly 16 characters.
while ((i % 16) != 0) {
printf (" ");
i++;
}
// And print the final ASCII bit.
printf (" %s\n", buff);
}
int main (int argc, char *argv[]) {
double d1 = 234.5;
char s1[] = "a 15char string";
char s2[] = "This is a slightly longer string";
hexDump ("d1", &d1, sizeof d1);
hexDump ("s1", &s1, sizeof s1);
hexDump ("s2", &s2, sizeof s2);
return 0;
}
The output on my system is:
我系统上的输出是:
d1:
0000 00 00 00 00 00 50 6d 40 .....Pm@
s1:
0000 61 20 31 35 63 68 61 72 20 73 74 72 69 6e 67 00 a 15char string.
s2:
0000 54 68 69 73 20 69 73 20 61 20 73 6c 69 67 68 74 This is a slight
0010 6c 79 20 6c 6f 6e 67 65 72 20 73 74 72 69 6e 67 ly longer string
0020 00 .
Since this question is tagged C++ too, here's an iostream version to compare. Even if you're not a particular fan of iostreams, it still fits in if you're already using them. Being able to use hexdump(any_obj)
is nice too, but of course can be done with just a delegating function template similar to the ctor.
由于这个问题也被标记为c++,这里有一个可供比较的iostream版本。即使你不是一个特别喜欢iostreams的人,如果你已经使用了它,它仍然是合适的。能够使用hexdump(any_obj)也很好,但是当然可以使用一个类似于ctor的委托函数模板。
#include <iomanip>
#include <ostream>
#include <string>
struct hexdump {
void const* data;
int len;
hexdump(void const* data, int len) : data(data), len(len) {}
template<class T>
hexdump(T const& v) : data(&v), len(sizeof v) {}
friend
std::ostream& operator<<(std::ostream& s, hexdump const& v) {
// don't change formatting for s
std::ostream out (s.rdbuf());
out << std::hex << std::setfill('0');
unsigned char const* pc = reinterpret_cast<unsigned char const*>(v.data);
std::string buf;
buf.reserve(17); // premature optimization
int i;
for (i = 0; i < v.len; ++i, ++pc) {
if ((i % 16) == 0) {
if (i) {
out << " " << buf << '\n';
buf.clear();
}
out << " " << std::setw(4) << i << ' ';
}
out << ' ' << std::setw(2) << unsigned(*pc);
buf += (0x20 <= *pc && *pc <= 0x7e) ? *pc : '.';
}
if (i % 16) {
char const* spaces16x3 = " ";
out << &spaces16x3[3 * (i % 16)];
}
out << " " << buf << '\n';
return s;
}
};
int main() {
std::cout << "double:\n" << hexdump(234.5);
std::cout << "string 1:\n" << hexdump("a 15char string");
std::cout << "string 2:\n" << hexdump("This is a slightly longer string");
return 0;
}
#4
2
If you're looking to view this from gdb you can issue:
如果你想从gdb上查看,你可以发布:
x /gx d
The g will print the value as a giant (8 bytes)
g将以巨大的形式打印值(8字节)
#5
2
If you want to print the double values in bits try this. I have tried for float value. If you changed that you can be able to view the double value in 64 bits.
如果你想打印双值位,试试这个。我尝试过浮动价值。如果你改变了它,你就可以看到64位的双值。
#include <stdio.h>
int main (void)
{
float f = 10.0f;
struct Float {
unsigned char bit01:1;
unsigned char bit02:1;
unsigned char bit03:1;
unsigned char bit04:1;
unsigned char bit05:1;
unsigned char bit06:1;
unsigned char bit07:1;
unsigned char bit08:1;
unsigned char bit09:1;
unsigned char bit10:1;
unsigned char bit11:1;
unsigned char bit12:1;
unsigned char bit13:1;
unsigned char bit14:1;
unsigned char bit15:1;
unsigned char bit16:1;
unsigned char bit17:1;
unsigned char bit18:1;
unsigned char bit19:1;
unsigned char bit20:1;
unsigned char bit21:1;
unsigned char bit22:1;
unsigned char bit23:1;
unsigned char bit24:1;
unsigned char bit25:1;
unsigned char bit26:1;
unsigned char bit27:1;
unsigned char bit28:1;
unsigned char bit29:1;
unsigned char bit30:1;
unsigned char bit31:1;
unsigned char bit32:1;
};
struct Float *F;
F = (struct Float *) &f;
printf("\nMSB -->1 bit for sign bit; 8 bit for exponent; 23 bit for mantisa<-- LSB\n");
printf("%d ", F->bit32);
printf("%d", F->bit31);
printf("%d", F->bit30);
printf("%d", F->bit29);
printf("%d", F->bit28);
printf("%d", F->bit27);
printf("%d", F->bit26);
printf("%d", F->bit25);
printf("%d ", F->bit24);
printf("%d", F->bit23);
printf("%d", F->bit22);
printf("%d", F->bit21);
printf("%d", F->bit20);
printf("%d", F->bit19);
printf("%d", F->bit18);
printf("%d", F->bit17);
printf("%d", F->bit16);
printf("%d", F->bit15);
printf("%d", F->bit14);
printf("%d", F->bit13);
printf("%d", F->bit12);
printf("%d", F->bit11);
printf("%d", F->bit10);
printf("%d", F->bit09);
printf("%d", F->bit08);
printf("%d", F->bit07);
printf("%d", F->bit06);
printf("%d", F->bit05);
printf("%d", F->bit04);
printf("%d", F->bit03);
printf("%d", F->bit02);
printf("%d\n", F->bit01);
}
#6
2
Try
试一试
union Plop
{
double value;
char data[sizeof(double)];
};
Plop print;
print.value = 234.5;
std::copy(print.data,print.data+sizeof(double),std::ostream_iterator<int>(std::cout)," ");
std::cout << std::endl;
#7
1
Did you try taking the address of d
and print sizeof( d )
bytes starting from that address?
你试过从那个地址取d的地址并打印sizeof(d)字节吗?
#8
1
using your friendly debugger is the best way to see the value of the memory location, that is if u just want to see.
使用友好的调试器是查看内存位置值的最佳方式,即如果您只是想查看。
#9
0
I think you can use shift operation and mask to "mask out" the actual bits.
我认为你可以使用移位操作和蒙版来“屏蔽”实际的位元。
int t = 128;
int t = 128;
for(int i=0;i<8;++i) { printf("%d", p & t);
for(int i=0;i<8;+ i) {printf(“%d”,p & t);
p =>> 1;
p = > > 1;
t =>> 1; }
t = > > 1;}
#1
20
double d = 234.5;
/* 1. use a union */
union u {
double d;
unsigned char c[sizeof(double)];
};
union u tmp;
size_t i;
tmp.d = d;
for (i=0; i < sizeof(double); ++i)
printf("%02x\n", tmp.c[i]);
/* 2. memcpy */
unsigned char data[sizeof d];
size_t i;
memcpy(data, &d, sizeof d);
for (i=0; i < sizeof d; ++i)
printf("%02x\n", data[i]);
/* 3. Use a pointer to an unsigned char to examine the bytes */
unsigned char *p = (unsigned char *)&d;
size_t i;
for (i=0; i < sizeof d; ++i)
printf("%02x\n", p[i]);
All the methods show you the bytes—but the same double
value may print the bytes differently on different systems, e.g., due to different encodings (rare), or different endianness.
所有方法都向您显示字节——但是相同的double值可能会在不同的系统上以不同的方式打印字节,例如,由于不同的编码(罕见)或不同的意外发现。
#2
26
unsigned char *p = (unsigned char *)&d;
int i;
for (i = 0; i < sizeof d; i++)
printf("%02x ", p[i]);
#3
7
Courtesy of my library of useful snippets, here's a solution in C, complete with test harness, and providing both hex and ASCII data:
在我的有用代码库的帮助下,这里有一个C语言的解决方案,包含了测试工具,并提供了十六进制和ASCII数据:
#include <stdio.h>
void hexDump (char *desc, void *addr, int len) {
int i;
unsigned char buff[17]; // stores the ASCII data
unsigned char *pc = addr; // cast to make the code cleaner.
// Output description if given.
if (desc != NULL)
printf ("%s:\n", desc);
// Process every byte in the data.
for (i = 0; i < len; i++) {
// Multiple of 16 means new line (with line offset).
if ((i % 16) == 0) {
// Just don't print ASCII for the zeroth line.
if (i != 0)
printf (" %s\n", buff);
// Output the offset.
printf (" %04x ", i);
}
// Now the hex code for the specific character.
printf (" %02x", pc[i]);
// And store a printable ASCII character for later.
if ((pc[i] < 0x20) || (pc[i] > 0x7e))
buff[i % 16] = '.';
else
buff[i % 16] = pc[i];
buff[(i % 16) + 1] = '\0';
}
// Pad out last line if not exactly 16 characters.
while ((i % 16) != 0) {
printf (" ");
i++;
}
// And print the final ASCII bit.
printf (" %s\n", buff);
}
int main (int argc, char *argv[]) {
double d1 = 234.5;
char s1[] = "a 15char string";
char s2[] = "This is a slightly longer string";
hexDump ("d1", &d1, sizeof d1);
hexDump ("s1", &s1, sizeof s1);
hexDump ("s2", &s2, sizeof s2);
return 0;
}
The output on my system is:
我系统上的输出是:
d1:
0000 00 00 00 00 00 50 6d 40 .....Pm@
s1:
0000 61 20 31 35 63 68 61 72 20 73 74 72 69 6e 67 00 a 15char string.
s2:
0000 54 68 69 73 20 69 73 20 61 20 73 6c 69 67 68 74 This is a slight
0010 6c 79 20 6c 6f 6e 67 65 72 20 73 74 72 69 6e 67 ly longer string
0020 00 .
Since this question is tagged C++ too, here's an iostream version to compare. Even if you're not a particular fan of iostreams, it still fits in if you're already using them. Being able to use hexdump(any_obj)
is nice too, but of course can be done with just a delegating function template similar to the ctor.
由于这个问题也被标记为c++,这里有一个可供比较的iostream版本。即使你不是一个特别喜欢iostreams的人,如果你已经使用了它,它仍然是合适的。能够使用hexdump(any_obj)也很好,但是当然可以使用一个类似于ctor的委托函数模板。
#include <iomanip>
#include <ostream>
#include <string>
struct hexdump {
void const* data;
int len;
hexdump(void const* data, int len) : data(data), len(len) {}
template<class T>
hexdump(T const& v) : data(&v), len(sizeof v) {}
friend
std::ostream& operator<<(std::ostream& s, hexdump const& v) {
// don't change formatting for s
std::ostream out (s.rdbuf());
out << std::hex << std::setfill('0');
unsigned char const* pc = reinterpret_cast<unsigned char const*>(v.data);
std::string buf;
buf.reserve(17); // premature optimization
int i;
for (i = 0; i < v.len; ++i, ++pc) {
if ((i % 16) == 0) {
if (i) {
out << " " << buf << '\n';
buf.clear();
}
out << " " << std::setw(4) << i << ' ';
}
out << ' ' << std::setw(2) << unsigned(*pc);
buf += (0x20 <= *pc && *pc <= 0x7e) ? *pc : '.';
}
if (i % 16) {
char const* spaces16x3 = " ";
out << &spaces16x3[3 * (i % 16)];
}
out << " " << buf << '\n';
return s;
}
};
int main() {
std::cout << "double:\n" << hexdump(234.5);
std::cout << "string 1:\n" << hexdump("a 15char string");
std::cout << "string 2:\n" << hexdump("This is a slightly longer string");
return 0;
}
#4
2
If you're looking to view this from gdb you can issue:
如果你想从gdb上查看,你可以发布:
x /gx d
The g will print the value as a giant (8 bytes)
g将以巨大的形式打印值(8字节)
#5
2
If you want to print the double values in bits try this. I have tried for float value. If you changed that you can be able to view the double value in 64 bits.
如果你想打印双值位,试试这个。我尝试过浮动价值。如果你改变了它,你就可以看到64位的双值。
#include <stdio.h>
int main (void)
{
float f = 10.0f;
struct Float {
unsigned char bit01:1;
unsigned char bit02:1;
unsigned char bit03:1;
unsigned char bit04:1;
unsigned char bit05:1;
unsigned char bit06:1;
unsigned char bit07:1;
unsigned char bit08:1;
unsigned char bit09:1;
unsigned char bit10:1;
unsigned char bit11:1;
unsigned char bit12:1;
unsigned char bit13:1;
unsigned char bit14:1;
unsigned char bit15:1;
unsigned char bit16:1;
unsigned char bit17:1;
unsigned char bit18:1;
unsigned char bit19:1;
unsigned char bit20:1;
unsigned char bit21:1;
unsigned char bit22:1;
unsigned char bit23:1;
unsigned char bit24:1;
unsigned char bit25:1;
unsigned char bit26:1;
unsigned char bit27:1;
unsigned char bit28:1;
unsigned char bit29:1;
unsigned char bit30:1;
unsigned char bit31:1;
unsigned char bit32:1;
};
struct Float *F;
F = (struct Float *) &f;
printf("\nMSB -->1 bit for sign bit; 8 bit for exponent; 23 bit for mantisa<-- LSB\n");
printf("%d ", F->bit32);
printf("%d", F->bit31);
printf("%d", F->bit30);
printf("%d", F->bit29);
printf("%d", F->bit28);
printf("%d", F->bit27);
printf("%d", F->bit26);
printf("%d", F->bit25);
printf("%d ", F->bit24);
printf("%d", F->bit23);
printf("%d", F->bit22);
printf("%d", F->bit21);
printf("%d", F->bit20);
printf("%d", F->bit19);
printf("%d", F->bit18);
printf("%d", F->bit17);
printf("%d", F->bit16);
printf("%d", F->bit15);
printf("%d", F->bit14);
printf("%d", F->bit13);
printf("%d", F->bit12);
printf("%d", F->bit11);
printf("%d", F->bit10);
printf("%d", F->bit09);
printf("%d", F->bit08);
printf("%d", F->bit07);
printf("%d", F->bit06);
printf("%d", F->bit05);
printf("%d", F->bit04);
printf("%d", F->bit03);
printf("%d", F->bit02);
printf("%d\n", F->bit01);
}
#6
2
Try
试一试
union Plop
{
double value;
char data[sizeof(double)];
};
Plop print;
print.value = 234.5;
std::copy(print.data,print.data+sizeof(double),std::ostream_iterator<int>(std::cout)," ");
std::cout << std::endl;
#7
1
Did you try taking the address of d
and print sizeof( d )
bytes starting from that address?
你试过从那个地址取d的地址并打印sizeof(d)字节吗?
#8
1
using your friendly debugger is the best way to see the value of the memory location, that is if u just want to see.
使用友好的调试器是查看内存位置值的最佳方式,即如果您只是想查看。
#9
0
I think you can use shift operation and mask to "mask out" the actual bits.
我认为你可以使用移位操作和蒙版来“屏蔽”实际的位元。
int t = 128;
int t = 128;
for(int i=0;i<8;++i) { printf("%d", p & t);
for(int i=0;i<8;+ i) {printf(“%d”,p & t);
p =>> 1;
p = > > 1;
t =>> 1; }
t = > > 1;}