TransWikia.com

Не работает побайтовый вывод

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));
}

Почему не работает побайтовый вывод и выводится пустота?
И как правильно сделать побайтовый вывод?

2 Answers

Вы же даже имя функции по-разному пишете, что ж тут ждать...

Попробуйте так:

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP