Как создать массив байтов в C++?
пожалуйста, посмотрите на файл заголовка followng
#pragma once
class MissileLauncher
{
public:
MissileLauncher(void);
private:
byte abc[3];
};
это вызвало ошибку
Error 1 error C2143: syntax error : missing ';' before '*'
Я пытался сделать это таким образом
byte *abc;
но это также не удалось, та же ошибка. Однако я заметил, что могу вызвать другие встроенные массивы tyes таким образом, например, массив int. Почему это происходит с массивом byte? Как это решить? Я хотел бы назначить значения в файле cpp. Есть идеи?
7 ответов
попробовать
class MissileLauncher
{
public:
MissileLauncher(void);
private:
unsigned char abc[3];
};
или
using byte = unsigned char;
class MissileLauncher
{
public:
MissileLauncher(void);
private:
byte abc[3];
};
**Примечание: в старых компиляторах (не C++11) замените using
строку с typedef unsigned char byte;
Byte не является стандартным типом В C или c++. Попробуйте char, который обычно имеет длину не менее 8 бит.
возможно, вы можете использовать std::bitset
тип доступен в C++11. Он может использоваться для представления фиксированной последовательности N
биты, которыми можно манипулировать с помощью обычной логики.
#include<iostream>
#include<bitset>
class MissileLauncher {
public:
MissileLauncher() {}
void show_bits() const {
std::cout<<m_abc[2]<<", "<<m_abc[1]<<", "<<m_abc[0]<<std::endl;
}
bool toggle_a() {
// toggles (i.e., flips) the value of `a` bit and returns the
// resulting logical value
m_abc[0].flip();
return m_abc[0];
}
bool toggle_c() {
// toggles (i.e., flips) the value of `c` bit and returns the
// resulting logical value
m_abc[2].flip();
return m_abc[2];
}
bool matches(const std::bitset<3>& mask) {
// tests whether all the bits specified in `mask` are turned on in
// this instance's bitfield
return ((m_abc & mask) == mask);
}
private:
std::bitset<3> m_abc;
};
typedef std::bitset<3> Mask;
int main() {
MissileLauncher ml;
// notice that the bitset can be "built" from a string - this masks
// can be made available as constants to test whether certain bits
// or bit combinations are "on" or "off"
Mask has_a("001"); // the zeroth bit
Mask has_b("010"); // the first bit
Mask has_c("100"); // the second bit
Mask has_a_and_c("101"); // zeroth and second bits
Mask has_all_on("111"); // all on!
Mask has_all_off("000"); // all off!
// I can even create masks using standard logic (in this case I use
// the or "|" operator)
Mask has_a_and_b = has_a | has_b;
std::cout<<"This should be 011: "<<has_a_and_b<<std::endl;
// print "true" and "false" instead of "1" and "0"
std::cout<<std::boolalpha;
std::cout<<"Bits, as created"<<std::endl;
ml.show_bits();
std::cout<<"is a turned on? "<<ml.matches(has_a)<<std::endl;
std::cout<<"I will toggle a"<<std::endl;
ml.toggle_a();
std::cout<<"Resulting bits:"<<std::endl;
ml.show_bits();
std::cout<<"is a turned on now? "<<ml.matches(has_a)<<std::endl;
std::cout<<"are both a and c on? "<<ml.matches(has_a_and_c)<<std::endl;
std::cout<<"Toggle c"<<std::endl;
ml.toggle_c();
std::cout<<"Resulting bits:"<<std::endl;
ml.show_bits();
std::cout<<"are both a and c on now? "<<ml.matches(has_a_and_c)<<std::endl;
std::cout<<"but, are all bits on? "<<ml.matches(has_all_on)<<std::endl;
return 0;
}
компиляция с использованием gcc 4.7.2
g++ example.cpp -std=c++11
Я:
This should be 011: 011
Bits, as created
false, false, false
is a turned on? false
I will toggle a
Resulting bits:
false, false, true
is a turned on now? true
are both a and c on? false
Toggle c
Resulting bits:
true, false, true
are both a and c on now? true
but, are all bits on? false
Byte не является стандартным типом данных в C / C++, но его все равно можно использовать так, как, я полагаю, вы хотите. Вот как: вспомните, что байт-это восьмиразрядный размер памяти, который может представлять любое из целых чисел от -128 до 127 включительно. (В этом диапазоне 256 целых чисел; восемь битов могут представлять 256 - два, возведенные в степень восемь-разные значения.). Также напомним, что тип char в C/C++ - это один байт (восемь бит). Итак, все, что вам нужно сделать, чтобы иметь тип данных byte в C / C++, это поместить это код в верхней части исходного файла: #определить байтовый символ Теперь вы можете объявить байт abc[3];
вы можете использовать Qt, который, если вы не знаете, является C++ с кучей дополнительных библиотек и классов и еще много чего. Qt имеет очень удобный класс QByteArray, который, я уверен, подойдет вашим потребностям.
Byte не является стандартным типом В C / C++, поэтому он представлен char
.
преимуществом этого является то, что вы можете лечить basic_string
как массив байтов, позволяющий безопасно хранить и передавать функции. Это поможет вам избежать утечек памяти и ошибок сегментации, которые могут возникнуть при использовании различных форм char[]
и char*
.
например, это создает строку в байтовый массив значений null:
typedef basic_string<unsigned char> u_string;
u_string bytes = u_string(16,'');
это позволяет стандартные побитовые операции с другими char
значения, включая те, которые хранятся в other string
переменные. Например, для XOR char
значения другой u_string
на bytes
:
u_string otherBytes = "some more chars, which are just bytes";
for(int i = 0; i < otherBytes.length(); i++)
bytes[i%16] ^= (int)otherBytes[i];