Merhaba,
İşlerin yoğunluğundan ne zamandır kendimle bir meydan okuma fırsatı bulamıyordum. Eee meydan okuyacak kimse bulamadığımdan AI'ya sordum:
"Bana herhangi bir metni hexadecimal olarak kodlar mısın? Not: İçinde Türkçe karakter ve UTF özel karakterler de olabilir!"
O da bana hangi metni çevirmek istediğimi sordu ben de onu D'ye yönlendirmek için aşağıdaki kodun başlangıcını verdim:
module hexconverting;
void main()
{
string str = "Merhaba\n\tDünya!";
auto hex = str.toHexString;
enum expectedResult = "4D6572686162610A0944C3BC6E796121";
assert(hex == expectedResult);
import std.conv, std.stdio;
hexString!expectedResult.writeln;
}
auto toHexDigit(ubyte value)
{
if(value > 9) value += 7;
return '0' + value;
}
auto toHexString(const char[] str)
{
string result;
ubyte a, b;
foreach(ubyte c; str)
{
a = c / 16; b = c % 16;
result ~= a.toHexDigit;
result ~= b.toHexDigit;
}
return result;
}
Önce str.toUTF8.to!string.toHex.writeln;
hatalı cevabını söylediklerimden yola çıkarak verdi. Böyle aptal bir algoritmayı suçlayamazsınız ve hatalı olduğunu yazınca cevaba kısmen yaklaştı:
string toHexString(string input)
{
string hex;
foreach (char c; input)
{
hex ~= to!string(c).format("%02x");
}
return hex;
}
Elbette yine saçmaladı! Yani bir döngü içinde karakteri neden string'e çevirirsin ve madem string üzerinden (kütüphaneden faydalanarak) çevireceksin bu daha basit değil mi?
string toHexString(string str)
{
import std.format;
return str.format!"%-(%02X%)";
}
Tabi aradığım bu değildi, yukarda ilk paylaştığım kod gibi kütüphaneden bağımsız (önce toHexDigit, sonra toHexString) gibi bir şey yapmaktı. Yine kendime meydan okudum ve çok kısa şekilde icra ettiğimi düşünüyorum.
Dip Not: Elbette neden 7 ile topladığımı merak edenler olabilir. Çünkü 2 nibble arasında ASCII kod tablosundaki fark o kadar. Belki a ve b değişkenleri gereksizdi veya hız açısından faydası da olabilirdi.
Kolay gelsin...