Stack Overflow на русском Asked by Whitehorse on September 17, 2020
void bytewiseOut(DWORD64 addr, size_t size)
{
char* arr = new char[size];
arr=(char*)addr;
cout <<hex<< "addr: "<< addr<<endl;
for (int i = 0; i < size; i++)
{
cout << arr[i]<<" ";
}
}
int main()
{
int a=4;
bytewiseOut((DWORD64)&a,sizeof(a));
}
Почему не работает побайтовый вывод и выводится пустота?
И как правильно сделать побайтовый вывод?
Вы же даже имя функции по-разному пишете, что ж тут ждать...
Попробуйте так:
void bytewiseOut(void * addr, size_t size)
{
unsigned char* arr = (unsigned char*)addr;
cout << "addr: "<< hex << addr<<endl;
for (int i = 0; i < size; i++)
{
cout << hex << setfill('0') << setw(2) << (unsigned int )arr[i] << " ";
}
}
int main()
{
int a=4;
bytewiseOut(&a,sizeof(a));
}
P.S. Поборники чистоты потребуют перекопировать память в массив и потом работать... но, думаю, не ошибусь, если скажу, что в 99% при правильной памяти (как у вас - реальная переменная, а не адрес от балды) все будет работать...
Correct answer by Harry on September 17, 2020
#include <iostream>
#include <iomanip>
#include <sstream>
#include <cstdint>
using namespace std;
template <typename T>
string get_bytes(const T& value)
{
const size_t len = sizeof(value);
const uint8_t* buf = reinterpret_cast<const uint8_t*>(&value);
ostringstream out;
for (size_t i = 0; i < len; i += 1) {
out << setfill('0') << setw(2) << hex << +buf[i] << ' ';
}
return out.str().substr(0, len*3-1);
}
int main(int argc, char* argv[])
{
int i = 4;
float f = 1.1;
double d = 2.2;
char c = '0';
cout << "(int) " << i << ": " << get_bytes(i) << ", addr: " << get_bytes(&i) << endl;
cout << "(float) " << f << ": " << get_bytes(f) << ", addr: " << get_bytes(&f) << endl;
cout << "(double) " << d << ": " << get_bytes(d) << ", addr: " << get_bytes(&d) << endl;
cout << "(char) '" << c << "': " << get_bytes(c) << ", addr: " << get_bytes(&c) << endl;
return 0;
}
Пример работы: https://godbolt.org/z/W5h1Ej
(int) 4: 04 00 00 00, addr: 5c 30 6a 03 fd 7f 00 00
(float) 1.1: cd cc 8c 3f, addr: 58 30 6a 03 fd 7f 00 00
(double) 2.2: 9a 99 99 99 99 99 01 40, addr: 50 30 6a 03 fd 7f 00 00
(char) '0': 30, addr: 4f 30 6a 03 fd 7f 00 00
Answered by Dmitry Sokolov on September 17, 2020
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP