защо шестнадесетичният изход на данни е различен?

Пиша много прост код за тестване на Hex данните на c++

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, а не като цяло число. Трябва да преобразувате към несимволен интегрален тип, за да се интерпретира входът като число, а не като знак. - person David Hammen; 27.05.2013
comment
Zeyad Serag - Нямате нужда от тези скоби около int. Върнах вашата редакция. Предпочитам да не използвам неща като (TypeName) x. Това е отливка в стил С. Винаги компилирам с предупреждения за използване на отливки в стил C. TypeName(x) е функционален стил. Това е незаконен синтаксис в C, но имайте предвид, че C++ не е C. - person David Hammen; 27.05.2013