Как создать массив байтов в 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;


Если вы хотите ровно один байт, uint8_t, определенный в cstdint, будет наиболее выразительным.

http://www.cplusplus.com/reference/cstdint/


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, который, я уверен, подойдет вашим потребностям.

http://qt-project.org/


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];