Попытка распределить символы по битам в изображении (стеганография)C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Попытка распределить символы по битам в изображении (стеганография)

Сообщение Anonymous »

Я пытаюсь скрыть текст UTF8 внутри каналов RGB внутри QImage, разделяя каждый байт на 4 байта, на два целых числа без знака, повторяя до конца сообщения, примерно так:
0xFFAABBCC 0xFFAABBCC
Проблема в том, что то я не уверен, что структура памяти, возвращаемая QImage::bits(), представляет собой непрерывный поток значений QRgb с сохраненным порядком байтов. Если нет, то это может объяснить, почему приведенный ниже код, который работал с непрерывным вектором, не работает, если он адаптирован для работы с QImage::bits.
Вот рабочая тестовая программа, использующая вектор :
#include
#include
#include
#include
#include
using namespace std;
string unpack_msg_bitset(vector input)
{
using position_t = size_t;
string result(input.size()*2,0);
for (size_t block_index=0; block_index < input.size()-1; block_index+=2) {
bitset argb1{input[block_index]};
bitset argb2{input[block_index+1]};
bitset msg_char{0};
msg_char.set(position_t(0), argb1.test(position_t(32-15)));
msg_char.set(position_t(1), argb1.test(position_t(32-16)));
msg_char.set(position_t(2), argb1.test(position_t(32-23)));
msg_char.set(position_t(3), argb1.test(position_t(32-24)));
msg_char.set(position_t(4), argb1.test(position_t(32-31)));
msg_char.set(position_t(5), argb1.test(position_t(32-32)));
msg_char.set(position_t(6), argb2.test(position_t(32-15)));
msg_char.set(position_t(7), argb2.test(position_t(32-16)));
char ch = static_cast(msg_char.to_ulong());
result.append(1,ch);
}
return result;
}
vector pack_msg_bitset(string msg)
{
using position_t = size_t;
vector result = {
0xffABC4E5,0xffABC4E5,0xffABC4E5,0xffABC4E5,0xffABC4E5,0xffABC4E5,
0xffABC4E5,0xffABC4E5,0xffABC4E5,0xffABC4E5,0xffABC4E5,0xffABC4E5,
0xffABC4E5,0xffABC4E5,0xffABC4E5,0xffABC4E5,0xffABC4E5,0xffABC4E5,
0xffABC4E5,0xffABC4E5,0xffABC4E5,0xffABC4E5,0xffABC4E5,0xffABC4E5,
};
int block_index=0;
for (size_t i=0; i < msg.size(); i++) {
if (block_index >= result.size() - 1) {
break;
}
bitset argb1{result[block_index]};
bitset argb2{result[block_index+1]};
bitset msg_char{msg};
argb1.set(position_t(32-15), msg_char[0]);
argb1.set(position_t(32-16), msg_char[1]);
argb1.set(position_t(32-23), msg_char[2]);
argb1.set(position_t(32-24), msg_char[3]);
argb1.set(position_t(32-31), msg_char[4]);
argb1.set(position_t(32-32), msg_char[5]);
argb2.set(position_t(32-15), msg_char[6]);
argb2.set(position_t(32-16), msg_char[7]);
result[block_index] = static_cast(argb1.to_ulong());
result[block_index+1] = static_cast(argb2.to_ulong());
block_index += 2;
}
return result;
}
int main()
{
auto elems = pack_msg_bitset("bush hid");
cout

Подробнее здесь: https://stackoverflow.com/questions/797 ... gonography
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»