所以,正在构建这个类:
public class BitArray {
public:
unsigned char* Data;
UInt64 BitLen;
UInt64 ByteLen;
private:
void SetLen(UInt64 BitLen) {
this->BitLen = BitLen;
ByteLen = (BitLen + 7) / 8;
Data = new unsigned char(ByteLen + 1);
Data[ByteLen] = 0;
}
public:
BitArray(UInt64 BitLen) {
SetLen(BitLen);
}
BitArray(unsigned char* Data, UInt64 BitLen) {
SetLen(BitLen);
memcpy(this->Data, Data, ByteLen);
}
unsigned char GetByte(UInt64 BitStart) {
UInt64 ByteStart = BitStart / 8;
unsigned char BitsLow = (BitStart - ByteStart * 8);
unsigned char BitsHigh = 8 - BitsLow;
unsigned char high = (Data[ByteStart] & ((1 << BitsHigh) - 1)) << BitsLow;
unsigned char low = (Data[ByteStart + 1] >> BitsHigh) & ((1 << BitsLow) - 1);
return high | low;
}
BitArray* SubArray(UInt64 BitStart, UInt64 BitLen) {
BitArray* ret = new BitArray(BitLen);
UInt64 rc = 0;
for (UInt64 i = BitStart; i < BitLen; i += 8) {
ret->Data[rc] = GetByte(i);
rc++;
}
Data[rc - 1] ^= (1 << (BitLen - ret->ByteLen * 8)) - 1;
return ret;
}
};
刚刚完成编写SubArray函数并继续测试但我得到了#34;访问冲突:尝试读取受保护的内存&#34;在GetByte(i)被调用的行上。我测试了一下,它似乎与数据数组或i无关,放置&#34; int derp = GetByte(0)&#34;在函数的第一行产生相同的错误。
从课外调用GetByte工作正常,我不明白最新情况。
测试函数如下所示:
unsigned char test[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
BitArray* juku = new BitArray(test, 64);
auto banana = juku->GetByte(7); //this works fine
auto pie = juku->SubArray(7, 8);
答案 0 :(得分:2)
您可能需要考虑创建一个数组字符,更改:
Data = new unsigned char(ByteLen + 1);
成:
Data = new unsigned char[ByteLen + 1];
在前者中,括号内的值不所需的长度,它是*Data
初始化的值。如果使用65(在ASCII系统中),则第一个字符变为A
。
话虽如此,C ++已经 一个非常高效的std::bitset
,对于你似乎处于的情况。如果你的目的是学习如何创建类,那么一定要写你自己。但是,如果你想让自己的生活变得简单,你可能需要考虑使用已经提供的设施,而不是自己动手。