我正在尝试根据另一个文件中的映射转换一个文件中的一些数据。
我的加密方案如下所示:
0 => 129367
1 => 998023
2 => 971513
3 => 365366
4 => 247647
5 => 131747
6 => 86151
7 => 898342
8 => 591121
9 => 828966
a => 185363
b => 420016
c => 472728
d => 185475
e => 669058
f => 472944
g => 932915
h => 109171
i => 940561
j => 483250
k => 240419
l => 158223
m => 494635
n => 205943
o => 19961
p => 989725
q => 125777
r => 195604
s => 818227
t => 83779
u => 990539
v => 639213
w => 669743
x => 546240
y => 950155
z => 631005
A => 126161
B => 403898
C => 323151
D => 536228
E => 653494
F => 810236
G => 808261
H => 900915
I => 60916
J => 417663
K => 371534
L => 384244
M => 900004
N => 300998
O => 346538
P => 5044
Q => 558707
R => 404479
S => 183163
T => 505254
U => 497969
V => 197795
W => 953877
X => 394637
Y => 760236
Z => 211436
! => 601326
" => 15745
# => 428427
$ => 602548
% => 938126
& => 159405
' => 528113
( => 8021
) => 910309
* => 747795
+ => 232242
, => 731593
- => 808534
. => 429705
/ => 916854
: => 241543
; => 755104
< => 314595
= => 398161
> => 606925
? => 804662
@ => 713498
[ => 431477
\ => 80381
] => 36645
^ => 156790
_ => 34787
` => 107682
{ => 283663
| => 650856
} => 91921
~ => 752056
=> 494223
=> 521932
=> 816279
=> 301703
=> 17163
=> 867641
ą => 817209
ś => 594615
ż => 570356
ź => 913303
ł => 752084
ó => 838178
ę => 693877
ń => 564418
ć => 30975
Ż => 707466
我的加密文本如下所示:
631005,323151,810236,60916,384244,346538,404479
我尝试使用以下代码替换循环中的字符:
$my_file = 'encrypted_text.txt';
$handle = fopen($my_file, 'r');
$data = fread($handle,filesize($my_file));
echo "\n".$data."\n";
$file = fopen("encryption_scheme.txt", "r");
$members = array();
while (!feof($file))
{
$code = substr(fgets($file), strrpos(fgets($file), '=> ' )+1);
$code = str_replace('>', '', $code);
$code = str_replace(' ', '', $code);
$letter = substr(fgets($file), 0, 1);
$data = str_replace(',', ' ', $data);
$data = str_replace($code, $letter, $data);
}
echo $data;
fclose($file);
但是它没有得到解密的文本,而是重复类似的代码
631005,323151,810236,60916,384244,346538,404479
631005 323151 810236 60916 384244 346538 404479
更新
while (!feof($file))
{
$text = fgets($file);
$code = substr($text, strrpos($text, '=> ' )+1);
$code = str_replace('>', '', $code);
$code = str_replace(' ', '', $code);
$letter = substr($text, 0, 1);
$data = str_replace(',', ' ', $data);
$data = str_replace($code, $letter, $data);
}
我期望得到 z C F I L O R
的结果。
最佳答案
您的第一个问题是,fgets
返回文本包括换行符(并且取决于系统回车符)。
你的第二个问题是,某些“字母”的长度不是“一个字符”(即末尾的 unicode 字符)。
你的第三个问题是,如果加密方案发生变化,你可能会遇到意想不到的结果。假设您的加密方案是这样的:
a => 1
b => 12
c => 2
显然是 b
的文本 12
会变成 ac
(因为顺序)。
在我看来,这得出的结论是,mickmackusa 的答案是最好的 - 特别是他答案的第二部分,逐个代码地检查密文。
我的旧解决方案
我可能会使用
$data = str_replace(',', ' ', $data); // do this once, not every iteration
while($text = fgets($file) { // fgets returns false on eof
list($letter, $code) = explode(' => ', $text, 2);
$code = trim($code); // <-- removes whitespace and new lines and so on
$data = str_replace($code, $letter, $data);
}
更新:
// expand the text, if no "=>" is found:
while(...) {
if(strpos($text, '=>') === FALSE) {
$text = fgets($text);
}
if(!trim($text)) { // completely empty lines, even after expanding (EOF)
break;
}
// rest as before
}
关于php - 解析一个文件并使用该数据解密另一个文件的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55117731/