Skip to content

Instantly share code, notes, and snippets.

@AlphaBs
Created June 5, 2022 09:39
Show Gist options
  • Save AlphaBs/7132e7f84cb579c24cf97f9b942ccd81 to your computer and use it in GitHub Desktop.
Save AlphaBs/7132e7f84cb579c24cf97f9b942ccd81 to your computer and use it in GitHub Desktop.
using System.Text.RegularExpressions;
// $('input[name="service_code"]').val()
string _d(string r)
{
int a, e, n, t, f, d, h;
string i = "yL/M=zNa0bcPQdReSfTgUhViWjXkYIZmnpo+qArOBslCt2D3uE4Fv5G6wH178xJ9K";
string o = "";
int c = 0;
r = Regex.Replace(r, @"[^A-Za-z0-9+/=]", "");
for (; c < r.Length;)
{
t = i.IndexOf(r[c++]);
f = i.IndexOf(r[c++]);
d = i.IndexOf(r[c++]);
h = i.IndexOf(r[c++]);
a = t << 2 | f >> 4;
e = (15 & f) << 4 | d >> 2;
n = (3 & d) << 6 | h;
o += (char)a;
if (64 != d) o += (char)e;
if (64 != h) o += (char)n;
}
return o;
}
string _f(string r, string _r)
{
var _rs = _r.Split(',');
var c = "";
for (int n = 0; n < _rs.Length; n++)
{
var tc = (2 * (float.Parse(_rs[n]) - n - 1) / (13 - n - 1));
c += (char)tc;
}
return Regex.Replace(r, @"(.{10})$", c);
}
string convert_r(string tvl)
{
var charArr = tvl.ToCharArray();
var fi = tvl[0] - '0';
fi = fi > 5 ? fi - 5 : fi + 4;
charArr[0] = (char)(fi + '0');
return new string(charArr);
}
string convertServiceCode(string serviceCode, string rRaw)
{
var _r = _d(rRaw);
_r = convert_r(_r);
return _f(serviceCode, _r);
}
var testcases = new[]
{
new ServiceCodeTestCase
{
R = "QgnHPM0HQ4w5PM05R/u4dMYtQ+0HPM=6d4w5PMQEQ4uEQ+ntQg0FPMnFP+UK",
InputServiceCode = "21ac6d96ad152e8f15a05b7350a2475909d19bcedeba9d4face8115e9bc1fa4e69723ec5ce0bf0b1105e9ea3edaaf17e527fd210ecee3a7073209b578a56acb19e62d070492b9639fe2fd4d616f4fa0ec1aa47e651836a74cd0c1b3d0eb6484496238f01f4db97d8e801ac3e878a1c25233d6089936119bf33db1086914531ab77050029d1cdfbe327b8409f175f684612954bebde386fd9999e19a64f0f69a7607cbb0a072e6a4785c04de95eca4939e2f3ba1a5f8483570a515b7e5601bc6ca0fdcb6ec30399ac48a1b33f81f091",
ExpectedServiceCode = "21ac6d96ad152e8f15a05b7350a2475909d19bcedeba9d4face8115e9bc1fa4e69723ec5ce0bf0b1105e9ea3edaaf17e527fd210ecee3a7073209b578a56acb19e62d070492b9639fe2fd4d616f4fa0ec1aa47e651836a74cd0c1b3d0eb6484496238f01f4db97d8e801ac3e878a1c25233d6089936119bf33db1086914531ab77050029d1cdfbe327b8409f175f684612954bebde386fd9999e19a64f0f69a7607cbb0a072e6a4785c04de95eca4939e2f3ba1a5f8483570a515b7e5601bc6ca0fdcb6ec30399ac48a1b53681f091"
},
new ServiceCodeTestCase
{
R = "QgnHPMQEdTw5PM0vR/u4Q+ytdMy5PM=wR/uEdgStQgQuP+UtQ+yHPM=5dTw5",
InputServiceCode = "21ac6d96ad152e8f15a05b7350a2475909d19bcedeba9d4face8115e9bc1fa4e6e7a3dcac30cf0b1105e9ea3edaaf17e98126fc2f6a38e55e7d8d3827b417a0c3b34e3b8c1a5e426e39ad97e7a9a3855469435c07415a913e087412a64ff0286a18dcadf4edf8c99342f71e55465cc9cc21436f1bf11d13988b17476a4d9c8d43b1569a87ff77fe671917256da7667c1332adc9143d0e742789e0d0af777711f0c603f82fab577650ddd8cef65d1b092be3d40817e391f36650f38ab9d801dccdabe18d411da",
ExpectedServiceCode = "21ac6d96ad152e8f15a05b7350a2475909d19bcedeba9d4face8115e9bc1fa4e6e7a3dcac30cf0b1105e9ea3edaaf17e98126fc2f6a38e55e7d8d3827b417a0c3b34e3b8c1a5e426e39ad97e7a9a3855469435c07415a913e087412a64ff0286a18dcadf4edf8c99342f71e55465cc9cc21436f1bf11d13988b17476a4d9c8d43b1569a87ff77fe671917256da7667c1332adc9143d0e742789e0d0af777711f0c603f82fab577650ddd8cef65d1b092be3d40817e391f36650f38ab9d801dccdab910d411da"
}
};
foreach (var tc in testcases)
{
Console.WriteLine(tc.InputServiceCode);
var result = convertServiceCode(tc.InputServiceCode, tc.R);
Console.WriteLine(result);
if (result == tc.ExpectedServiceCode)
{
Console.WriteLine("PASS\n");
}
else
{
Console.WriteLine("FAIL\n");
}
}
class ServiceCodeTestCase
{
public string? R { get; set; }
public string? InputServiceCode { get; set; }
public string? ExpectedServiceCode { get; set; }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment