用于隐秘程序中。我正在尝试从bmp获取像素的R值的二进制等价物,即:如果R值为'255',我想要'11111111'。我将遍历一个字母的二进制值,并将每个像素颜色(R / G / B)中的最低有效位替换为该字母中的某个位,以便稍后进行检索。我有一个字符串工作:(Reverse是一种用于反转字符串的简单方法)
private string convToBits(string in_)
{
char letter = Convert.ToChar(in_);
//convert letter to 32-bit int
int value = Convert.ToInt32(letter);
//converting 32-bit int to (string) bits
BitArray ba = new BitArray(new int[] { value });
string bits32 = "";
for (int c = 0; c < ba.Length; c++)
{
if (c % 8 < 7) //get first 8 bits of the 32bit int
{
//true = 1, false = 0
if (ba[c])
{
bits32 += 1;
}
else
{
bits32 += 0;
}
}
}
//get only the first byte of the 32bit (4 bytes) int and reverse using the function below
string bitString = Reverse(bits32.Substring(0, 8)); //we now have the letter in binary.
return bitString;
}
in_:'a'
返回:'01100001'
当然,这不适用于像素颜色,因为它的长度最多为3个字符(0-255)。
使用介于0-255之间的值来执行此操作的最佳方法是什么?
当机密是字符串,图像或其他任何东西时,您无需采用其他方法。只需以字节数组的形式读取文件(或将字符串转换为一个),然后使用该文件即可。
如果您考虑一下,隐写术会将位隐藏到其他位中。这些位的来源无关紧要。这样,您可以完全隐藏文本文件,zip文件,图像文件等。
为什么要读取图像文件字节流的另一个原因是jpeg,png和其他压缩格式占用的空间更少。如果加载jpeg文件的像素数组,然后隐藏这些像素,那就像隐藏未压缩的bmp的大小一样。并且您会为此添加所有不必要的复杂性。
我会这样:
一条建议。不要将位转换为字符串。我怀疑您这样做只是为了可视化1和0,但这效率极低。最好直接使用bitwise operations。例如,要将某位嵌入像素,请使用AND将lsb归零,然后使用OR将其添加。
// embed
pixel = pixel & 0b11111110 | secretBit
// extract
secretBit = pixel & 0b00000001