почему шестнадцатеричные данные выводятся по-разному?

Я пишу очень простой код для проверки данных Hex на С++.

int main()
{
    unsigned char bytestosend[4] = {0xB5, 0x62, 0x06, 0x08};

    cout << &bytestosend << endl;
}

Данные, которые приходят на терминал: 0xbfa1ef58

Как такое могло произойти ? и когда я удаляю '&', он дает мне странные символы


person Zeyad Serag    schedule 27.05.2013    source источник
comment
Использование амперсанда дает вам расположение памяти вашего массива, а не его содержимое. Если вы удалите амперсанд, вы печатаете строку, не заканчивающуюся нулем   -  person Hybrid    schedule 27.05.2013


Ответы (2)


Когда вы используете &, он выводит адрес массива, а когда вы этого не делаете, он печатает его как данные ASCII.

person Simon Broadhead    schedule 27.05.2013
comment
Разве ему не нужен нулевой байт 0x0? - person 0x499602D2; 27.05.2013
comment
Да, он, скорее всего, напечатает кучу тарабарщины, когда выйдет за конец массива. - person Simon Broadhead; 27.05.2013
comment
@ 0x499602D2 Только строковые литералы, инициализированные с помощью "...", имеют завершающий нулевой символ. - person SirGuy; 27.05.2013
comment
@GuyGreer Да, я знаю, но поскольку он использует массив символов и не инициализирует его строковым литералом, разве он не должен явно добавлять нулевой байт? - person 0x499602D2; 27.05.2013
comment
@ 0x499602D2 Если он хочет использовать его как строку, то да. - person SirGuy; 27.05.2013
comment
@Volte, что мне делать, чтобы распечатать данные внутри? - person Zeyad Serag; 27.05.2013
comment
Самый простой способ, вероятно, использовать printf в заголовке <cstdio>. printf("0x%02X 0x%02X 0x%02X 0x%02X", bytestosend[0], bytestosend[1], bytestosend[2], bytestosend[3]); - person Simon Broadhead; 28.05.2013

«&» означает «адрес» в этом контексте. Вы печатаете расположение bytestosend в памяти, а не его содержимое.

Удалите этот «&», и вы тоже не получите того, что хотите. Теперь этот оператор вставки потока (operator >>) видит массив char, поэтому он попытается напечатать ваш массив, как если бы это была строка. Ваш массив не завершается нулем, поэтому вывод может продолжаться некоторое время.

Если вы хотите напечатать все четыре элемента bytestosend в шестнадцатеричном формате, используйте что-то вроде этого:

std::cout.flags (std::ios::hex | std::ios::showbase);
std::cout << int(bytestosend[0]) << ", "
          << int(bytestosend[1]) << ", "
          << int(bytestosend[2]) << ", "
          << int(bytestosend[3]) << std::endl;
person David Hammen    schedule 27.05.2013
comment
Упс. Код исправлен. std::ostream & operator<<(char) интерпретирует ввод как char, а не целое число. Вам нужно привести к целочисленному типу, отличному от char, чтобы ввод интерпретировался как число, а не символ. - person David Hammen; 27.05.2013
comment
Zeyad Serag - Вам не нужны эти скобки вокруг int. Я откатил вашу правку. Я предпочитаю не использовать такие вещи, как (TypeName) x. Это актерский состав в стиле C. Я всегда компилирую с предупреждениями об использовании приведений в стиле C. TypeName(x) — актерский состав в функциональном стиле. Это недопустимый синтаксис в C, но имейте в виду, что C++ — это не C. - person David Hammen; 27.05.2013