我正在进行一个涉及阿拉伯字符的隐写术项目,并编写了一个名为“stegoText”的MATLAB函数。该函数读取两个UTF-8编码的文本文件“secretmessage.txt”和“covermessage.txt”,并执行以下步骤:
- 使用UNICODE值到二进制的Map表将阿拉伯字符转换为二进制
- 将二进制转换为DNA
- 通过将T替换为U并添加起始和终止密码子将DNA转化为RNA
- 对RNA序列执行霍夫曼压缩
- 将编码的字符串嵌入到阿拉伯文封面消息中
- 使用UTF-16 LE编码将结果写入'stego.txt'
该函数运行良好,但生成的“stego.txt”文件看起来很混乱。我该怎么解决这个问题?
以下是我在MATLAB上看到的和.txt文件中看到的不同之处:
下面是MATLAB代码:
function stego = stegoText()
file_path = 'C:\Users\Charbel\Desktop\secretmessage.txt';
secret = fileread(file_path);
file_path = 'C:\Users\Charbel\Desktop\covermessage.txt';
cover = fileread(file_path);
% Part A: Dealing with the arabic secret message
% Step 1: Convert from Arabic to Binary
% Mapping table for arabic characters to binary using UNICODE
mappingTable = table();
mappingTable.Arabic = ['ن'; 'ح'; 'ط'; 'ف'; 'ش'; 'ا'; 'ي'; 'ر'; 'و'; 'ك'; 'د'; 'ت'; 'ز'; 'ع'; ...
'م'; 'ص'; 'ج'; 'ه'; 'س'; 'ب'; 'ذ'; 'ض'; 'غ'; 'ظ'; 'ث'; 'ق'; 'خ'; 'ل'; ...
' '; '،'; '؛'; '.'; '9'; '8'; '7'; '4'; '1'; '6'; '0'; '2'; '5'; '3'; '؟'; 'َ'; 'ِ'; 'ؤ'; ...
'ُ'; 'ة'; 'ى'; 'ْ'; '٠'; '١'; '٣'; '٤'; '٥'; '٦'; '٧'; '٨'; '٩'; ...
'ء'; 'ئ'; ':'; '!'; '٢'];
mappingTable.Binary = ['000000'; '000001'; '000010'; '000011'; '000100'; '000101'; '000110'; '000111'; ...
'001000'; '001001'; '001010'; '001011'; '001100'; '001101'; '001110'; '001111'; '010000'; '010001'; ...
'010010'; '010011'; '010100'; '010101'; '010110'; '010111'; '011000'; '011001'; '011010'; '011011'; ...
'011100'; '011101'; '011110'; '011111'; '100000'; '100001'; '100010'; '100011'; '100100'; '100101'; ...
'100110'; '100111'; '101000'; '101001'; '101010'; '101011'; '101100'; '101101'; '101110'; '101111'; ...
'110000'; '110001'; '110010'; '110011'; '110101'; '110110'; '110111'; '111000'; '111001'; ...
'111010'; '111011'; '111100'; '111100'; '111101'; '111111'; '110100'];
secretBinary = '';
for i = 1:length(secret)
index = find(mappingTable.Arabic == secret(i));
binaryChar = mappingTable.Binary(index, :);
secretBinary = [secretBinary binaryChar];
end
% Step 2: Convert from Binary to DNA
dnaStrand = '';
for i = 1:2:length(secretBinary)
segment = secretBinary(i:i+1);
switch segment
case '00'
dnaBase = 'A';
case '01'
dnaBase = 'C';
case '10'
dnaBase = 'G';
case '11'
dnaBase = 'T';
end
dnaStrand = [dnaStrand dnaBase];
end
% Step 3: Convert from DNA to RNA (replace T by U, add start and stop codons)
rnaStrand = strrep(dnaStrand, 'T', 'U');
startCodon = 'AUG';
stopCodon = ['UAA'; 'UAG'; 'UGA'];
randomIndex = randi([1, 3]);
rnaStrand = [startCodon rnaStrand stopCodon(randomIndex, :)];
% Step 4: Huffmann compression
numericArray = double(rnaStrand);
symbols = unique(numericArray);
probabilities = ones(size(symbols)) / numel(symbols);
huffDict = huffmandict(symbols, probabilities);
save('huffman_dictionary.mat', 'huffDict');
encodedData = huffmanenco(numericArray, huffDict);
encodedString = char(encodedData + '0');
% Part B: Embedding the encoded string into the arabic cover message
% Step 1: Get the size of the encoded secret message, and the size of the cover message
sizeSecret = length(encodedString);
sizeCover = length(cover);
% Step 2: Embed the encodedString into the cover message
stego = '';
if sizeCover < sizeSecret
stego = 'Cover message is not long enough';
else
for i = 1:sizeSecret
bit = encodedString(i);
coverChar = cover(i);
if i == 1 && isletter(coverChar)
if bit == '1'
stego = [stego coverChar char(hex2dec('200D'))];
else
stego = [stego coverChar char(hex2dec('FEFF'))];
end
elseif i > 1 && ~isletter(cover(i-1)) && isletter(coverChar)
if bit == '1'
stego = [stego coverChar char(hex2dec('200D'))];
else
stego = [stego coverChar char(hex2dec('FEFF'))];
end
elseif isletter(coverChar) && i < sizeCover && isletter(cover(i+1))
if bit == '1'
stego = [stego coverChar char(hex2dec('200E'))];
else
stego = [stego coverChar char(hex2dec('200F'))];
end
elseif isletter(coverChar) && (i == sizeCover || ~isletter(cover(i+1)))
if bit == '1'
stego = [stego coverChar char(hex2dec('200C'))];
else
stego = [stego coverChar char(hex2dec('200B'))];
end
elseif ~isletter(coverChar)
if bit == '1'
stego = [stego coverChar char(hex2dec('2009'))];
else
stego = [stego coverChar char(hex2dec('200A'))];
end
end
end
stego = [stego cover(length(encodedString)+1:end)];
end
filePath = fullfile('C:', 'Users', 'Charbel', 'Desktop', 'stego.txt');
fileID = fopen(filePath, 'w', 'n', 'UTF-16LE');
fwrite(fileID, stego, 'char', 'n');
fclose(fileID);
end
1条答案
按热度按时间3pvhb19x1#
**1.-**您正在MATLAB中使用非阿拉伯语,西方拉丁字母表进行编码。
阅读和处理文件是从左到右。
从读者的Angular 来看,句子中最重要的部分是第一个词。
是的,有很多可以讨论的,从语法上讲,任何句子中最重要的词总是主语,其次是动词,然后是形容词,副词,等等。
但不,从纯粹交流的Angular 来看,我们需要从第一个单词开始,然后继续。
IT人员使用的术语是**Big/Little Endian。
Endianess intro.
然后使用记事本打开阿拉伯语编码的消息。这个从右到左。
当混合使用西方拉丁语和希伯来语的文本版本时,也会发生同样的情况:
单词和字符的顺序被两个系统在相反的方向上推动。
**2.-**您是否可以使用阿拉伯语版本的MATLAB并从左到右进行操作?
**3.-**或者把它都用相同的西方拉丁字母表和从左到右可能是另一个考虑的选择。
4.-实际上,阿拉伯语和西方拉丁语之间的字母Map不是完全一对一,因此,字符可能会在翻译中丢失或添加。
5.-最大化您的受众
只保留一个西方拉丁语版本会增加西方读者的数量。
建立另一个只使用阿拉伯语的工作版本也会增加阿拉伯语精通者的读者数量。
你看,当你出版东西的时候,双语者当然是少数群体,与非双语者相比。
你的应用程序不只是针对双语者,拥有生物学学位,熟悉MATLAB,是吗?
**6.-**串行通信中的等效概念是:最低有效位优先,或最高有效位优先。