Rakkoc.Com Recep Akkoç / Rakkocun Yazıtları

27Eki/140

C# Guid

Merhabalar basta google bot olmak ozere butun botlar ve onlari takip eden clientlar.

suanda bir projede ihtiyacim oldugu icin google'a danistigim bir seyi burayada not dusmek istedim.

//Guid Tanimla            
Guid aNewGuid = Guid.NewGuid();

// string'e ata (mailingde kullandigim formatim)            
string stringAsLikeGuid = aNewGuid.ToString();

// ByteArray olarak kullan (Bunu soket serverde cok kullaniyorum)            
byte[] likeByteArray = aNewGuid.ToByteArray();

// havada yaratip atama yapalim
string alsoUseFly = Guid.NewGuid().ToString();

// Havadakinin byte arrayi (bunuda zamaninda ornek olsun diye kodlamisim ama hic kullanmadim galba)
byte[] FlyByteArray = Guid.NewGuid().ToByteArray();

Google den lazim olan formatlama kismina bakmistim buraya not duseyim:

Console.WriteLine("Guid.NewGuid().ToString() = {0}", Guid.NewGuid().ToString());
Console.WriteLine("Guid.NewGuid().ToString(\"N\") = {0}", Guid.NewGuid().ToString("N"));
Console.WriteLine("Guid.NewGuid().ToString(\"D\") = {0}", Guid.NewGuid().ToString("D"));
Console.WriteLine("Guid.NewGuid().ToString(\"B\") = {0}", Guid.NewGuid().ToString("B"));
Console.WriteLine("Guid.NewGuid().ToString(\"P\") = {0}", Guid.NewGuid().ToString("P"));

ciktisi :

Guid.NewGuid().ToString() = 9b89ea45-0362-4bd7-b350-d8dbd768c581
Guid.NewGuid().ToString("N") = 1fa00e6adece4a19b121264508d91178
Guid.NewGuid().ToString("D") = eb941092-506e-4b8a-9945-7863bda96cc6
Guid.NewGuid().ToString("B") = {759ca2cb-9eed-4245-a378-3d16c9780876}
Guid.NewGuid().ToString("P") = (1afd9c5f-6a3a-462a-aa79-43c506b11639)

Daha fazlasi icin microsoft amcaya danisirim : http://msdn.microsoft.com/en-us/library/97af8hh4(v=vs.110).aspx

hayirdi iyi gecenin korleri bilokum.

21Eyl/140

CRC Nedir nerde nasıl ne için kullanılabilir

Merhaba sevgili okurlarım, Google ve diğer botlar.

Bugün CRC'den size bahsedeceğim.  CRC – Cyclic Redundancy Check dediğimiz arkadaş bir veri kontrol formatıdır. Bugunlerde Check Digitlerden bahsettim bol bol birde CRC yani türkçe adı ile Döngüsel Artıklık Denetimi . “Hata sezen” kod olarakta bilinir.

Mantıksal anlatımını çok iyi yapmayacağımdan bunun ile ilgili beğendiğim bir yaziyi Copy/Paste yaparacagim.

Öncelikle belirteyim bu CRC haberleşmede kullanılan ve “hata sezen” kod adı verilen bir yöntemdir. Zaten iki tip yöntem var: Hata sezen ve hata düzelten. Hata sezen, adından da anlaşılabileceği gibi, sadece verinin düzgün iletilip iletilmediğini anlamaya yarar. Hata düzelten ise hatayı bulur ve düzeltir. Peki hangi durumlarda bu ikisinden biri seçilir:

Diyelim ki uydu ile haberleşiyoruz. Burada uyduya aktarılan veriler (Uplink) ve uydudan gelen veriler (Downlink) oldukça yavaş aslında. Sonuçta uydunun avantajı çok geniş bir alanı kaplamasıdır. (Tüm dünya misal?) Burada hata sezen kod kullanırsak olası bir hata durumunda uydu bu durumu, veriyi aldığı merkeze belirtir ve aynı veri tekrar aktarılır. Zaten sistem yavaş, üstüne de böyle bir durum olursa daha bir yavaşlar diye bu noktada hata düzelten kod kullanılır. Hatayı düzeltebilmesi için verinin boyutu arttırılmalıdır. Hata düzelten yöntemini daha sonra farklı bir yazıda açıklayacağım. Hata sezen kodlara geri dönelim…

Yukarıdaki açıklamadan sonra herhalde nerede kullanılabileceği tahmin edilebilir: Aktarım hızımız çok yüksekse ve hatalı bir veri gelince bunun tekrar alınması sisteme koymayacaksa kullanılması gayet güzeldir hata sezen kodların. İşte bizim CRC de bunu yapmakta.

CRC’deki temel mantık, gönderilecek verinin sonuna verinin daha önceden belirlenen bir sayıya bölümünden kalan eklenir. Karşı taraf bu veri kümesini alınca daha önceden belirlenmiş sayıya böler. Sonuç sıfır ise veri hatasız aktarılmıştır. Olayı rakamlara dökmek daha iyi açıklayacaktır:

Misal göndermek istediğimiz veri 10011010 olsun. (Tamamen attım) Bu bölücü sayımız da (bu noktadan itibaren buna polinom diyeceğim sınavda filan sorulursa işin ezberi bu şekilde çünkü) belirlenebilir bir şey. Misal bu polinom da 11001 olsun diyorsam tamamen atıyorum ama hem alıcı hem verici bunu biliyor farz ediyorumdur. Sınavda da zaten “Falanca veriyi şu polinomla, CRC kodlaması ile nasıl göndeririz?” gibi bir soru çıkacaktır. Bu noktada sadece bu iki sayıyı birbirine bölüp verinin sonuna dört bit olarak eklememiz kafi ancak yine işin biraz ezberine girelim:

Veri 10011010 denmişse bunu bir polinom gibi yazmamız gerekiyor önce: Bunun için ikilik tabandaki bir sayıyı onluk tabana çevirirken kullandığımız “iki üzeri” terimleri yerine “x üzeri” diyoruz. Yani normalde bu sayı 2^7+2^4+2^3+2^1 iken biz buna x^7+x^4+x^3+x^1 diyoruz. Aynı şekilde bölücü polinom da (11001 demiştik üstte) x^4+x^3+1 oluyor. (Son hane x^0=1 durumunda) Bu noktadan sonra kısaca verinin sonuna dört bit sıfır ekliyoruz demek yerine iletilecek polinomu x^4 ile genişletiyoruz diyoruz. Yani 10011010, 100110100000 oluyor ve yine bunu polinom olarak yazarsak x^11+x^8+x^7+x^5 oluyor. Daha sonra son halindeki veri polinomu ile elimizdeki polinom üzerinde bölme işlemi uygulayıp son bitleri kalan ile değiştiriyoruz ve iş bitiyor. Bu noktadan sonra bir konuya netlik getireyim: Sakın bu işlemi onluk taban üzerinden yapmayın!

10011010 onluk tabanda 154’e karşılık gelmektedir. Elimizdeki bölücü polinom da (11001) 25’e denk geliyor. İkisini birbirine bölersek kalan dört çıkar. Bölüm bizi zerre ilgilendirmiyor ama kalan önemli. Onluk tabanda dört, ikilikte 0100’a denk gelmekte. Yani gönderilecek veri 100110100100 olacak… Değil aslında. Haydi diyelim sonun dört sıfır atmıştık yeni veri 100110100000 aslında diyelim ve o da onluk tabanda 2464’e denk gelmekte. Buna da 25’i bölersek kalan 13(1101) çıkıyor. Ancak donanımsal olarak bu bölme işlemi biraz farklı olduğundan az sonra göreceksiniz ki sonuç farklı çıkmakta…

100110100000| 11001
11001 | Bölüm de artık neyse… Siyah yazdıklarım bölme gereği bir aşağı inen bitler
010100
11001
011011
11001
00010000
11001
010010
11001
010110
11001
01111 —> Bakıyoruz ki kalan ne 0100 ne de 1101 çıktı.

Bilenler fark etmiştir sürekli iki değeri XOR’ladık. (Özel veya) XOR’un mantığı, aynı olan bitler 0, farklı olan bitler 1 çıkışı verir. Polinom aritmetiğinde bölme bölme diye sürekli söylediğim yerde bu XOR kullanılır ki bu fark da buradan geliyor. Hadi diyelim ben bu işlemi yanlış yaptım. Hemen Prentice Hall: Computer Networks, Fourth Edition kitabındaki örneği yazının sonuna yapıştırıyorum. Buradaki örneği ondalık olarak ele alalım:

Burada gönderilecek veri 1101011011 olarak belirtilmiş ve kendisi 859 yapıyor ondalık olarak. Bunun bi de sonunda dört sıfır olan 11010110110000 halini ele alırsak o da 13744 ‘e denk gelmekte. Bölüyoruz polinoma ki kendisi de 10011, ondalık 19, ilk hali ile kalan dört, uzatılmış halinde kalan yedi. Eee resme bi bakıyoruz (adamlar bölmüş güzel güzel göstere göstere) ve sonuç 1110 çıkmış, ondalık da 14 ediyor kendisi.

Bu ondalık işine nerden bulaştın derseniz; internette Türkçe kaynaklar genelde bu ondalık sistem üzerinden anlatıyor. Ben de garibim baktım çok da mantıklı geldi (kolay da), sınavda tuttum böle yaptım. Hocaya göstermelik de bu bölme işlemini yaptım ama bi baktım sonuç farklı! Dedim heralde yanlış işlem yaptım ondalık rakamlar yalan söylemez(!) sonucu değiştirverdim. Sonuç: Sınavdan -10 puan…

Neyse işte bu şekilde CRC kodlama ile gönderdik kodu, karşı tarafta alıp bölme işlemini yapıyor. Bu sondaki kalan eklenmiş halinde polinom bölmesi yapınca sonuç sıfır oluyor! Oldu ise tamam, durum güzel. Bu bölücü polinom iki tarafca da biliniyor kabul ediyoruz, tekrar belirteyim. Zaten en basitinden şifreli bir dosya açarken “CRC failed” diye bir hata alırsınız eğer şifre yanlışsa. Bu şifre de bizim polinomumuz olmuş oluyor.

Umarım yeterli açıklama yapabilmişimdirim. İnternet iyi güzel hoş, bilgi var da doğru bilgiyi ayırt edebilmek lazım(mış). Ben CRC için yapamadım bu ayrımı, sınavdan sonra dank etti ama olan oldu bi kere…

CRC.jpg

17Eyl/142

Ean8 ve Ean13 Barkod hesaplamasi

Merhabalar, Kacan uykumun pesinden kosmak yerine bloglamak istedim. Fakat suan macbookumda oldugum icin turkce karakter kullanamiyorum malesef. Dubai mali olunca cihaz 🙂

Bu aralar check algoritmalarinin paylasildigi bir yer haline gelmekte baktim ki burasi, Luhn Check mod 10 dogrulamasi mevcut, Tc Kimlik dogrulamasi mevcut C# da EAN 13 ve EAN8 nasil hesaplanir onu yazayim dedim.

Turkce karakter kullanmadigim icin ozur dileyecektim konuyu nasil dagittim nereye ne sekilde blog'un iceriginde dondu 🙁 anlamadim ve suan ise yarar birsey yapmanin en guzel kismi uykum geldi 🙁

Fazla uzatmiyim EAN 8 ve EAN 13 birer barkod cesididir. Hatta en cok kullanilanlardan birtanesidir. Ean13'u surekli ev urunlerinde gorurz uzunlu kisali olan barkod cesitlerindendir ean.

Ean 13 e ornek :

perakendecilik sektorunden bir ornek ve anlatimi.

Ean 13 ilk 12 hanesi barkod datasidir. 13. karakter kontrol dijit.

Ean 8 ilk 7 hanesi barkod datasi, 8. karakter kontrol dijiti.

kimi yerde kontrol dijiti kimi yerde check digit yaziyorum kusura bakmayin.

(Kodlar baska kaynaklardan alintidir..)

Ean 13 C# kodu :

static int _checksum_ean13(String data)
{
    // Test string for correct length
    if(data.Length != 12 && data.Length != 13)
        return -1;

    // Test string for being numeric
    for(int i=0;i<data.Length;i++)
    {
        if(data[i] < 0x30 || data[i] > 0x39)
            return -1;
    }

    int sum = 0;

    for(int i=11;i>=0;i--)
    {
        int digit = data[i] - 0x30;
        if ((i & 0x01) == 1)
            sum += digit;
        else
            sum += digit * 3;
    }
    int mod = sum % 10;
    return mod == 0 ? 0 : 10 - mod;
}

Ean 8 C# Kodu :

static int _checksum_ean8(String data)
{
    // Test string for correct length
    if(data.Length != 7 && data.Length != 8)
        return -1;
	
    // Test string for being numeric
    for(int i=0;i<data.Length;i++)
    {
        if(data[i] < 0x30 || data[i] > 0x39)
            return -1;
    }

    int sum = 0;

    for(int i=6;i>=0;i--)
    {
        int digit = data[i] - 0x30;
        if ((i & 0x01) == 1)
            sum += digit;
        else
            sum += digit * 3;
    }
    int mod = sum % 10;
    return mod == 0 ? 0 : 10 - mod;
}
15Eyl/145

TC Kimlik No Algoritması ve hesaplaması

Merhabalar sevgili okurlarım, gerçeği söylemek gerekirse okurum olabilecek bir içeriğim yok. Bunun farkındayım, daha çok googlayanlaya yönelik bilgi kaynağım mevcut tabi.

Düşük cümleler kuruyorsam affola. Yavaş yavaş Türkçe karakterleri kullanmaya çalışıyorum.

Bir önceki yazımda IMEI ve Kredi kartı gibi verilerin kontrolünde kullanılan algoritmayı paylaşmıştım. Luhn Check digit Mode 10 algoritması Bu yazımda da T.C. kimlik numarasının 10. ve 11. hanelerini hesaplayacağız.

Öncelik ile tc kimlik no Türkiye Cumhuriyeti vatandaşlarının kimliklerine verilen ID (identification) numaralarıdır. Devlet dairelerinde, bankalarda ve bir çok noktada güvenlik ve kimlik tanımlama işlemi için kullanılır. T.C. veri tabanında sorgulamak için belirli anlaşmalar yapmanız ve ücretini ödemeniz gerekmektedir. T.C. Kimlik No o kişiye ait mi bunun kontrolünü direk siz yapamazsınız fakat Numara kurallara uygun mu buna bakarsınız; Bunun için gerekli bilgiler :
  1. TC Kimlik numaraları 11 basamaktan oluşmaktadır.
  2.  İlk 9 basamak arasında kurulan bir algoritma bize 10. basmağı, ilk 10 basamak arasında kurulan algoritma ise bize 11. basamağı verir.
  3.  11 hanelidir.
  4. Her hanesi rakamsal değer içerir.
  5.  İlk hane 0 olamaz.
  6. Son hane tek sayi (1,3,5,7,9) olamaz
  7. 1. 3. 5. 7. ve 9. hanelerin toplamının 7 katından, 2. 4. 6. ve 8. hanelerin toplamı çıkartıldığında, elde edilen sonucun 10′a bölümünden kalan, yani Mod10′u bize 10. haneyi verir.
  8. 1. 2. 3. 4. 5. 6. 7. 8. 9. ve 10. hanelerin toplamından elde edilen sonucun 10′a bölümünden kalan, yani Mod10′u bize 11. haneyi verir.
  9. 10. hanenin hesaplama şekline göre çift bir sayının 10'a bölümü çift, tek bir sayının 10'a bölümü tek sayı olur. 2 adet çift sayının toplamı çift, 2 adet tek sayının toplamı çift sonuç verir. Bu sonuça göre Son hane her zaman çifttir. 

Şimdi gelelim farklı dillerdeki doğrulama örneklerine.

C#

public static bool TcDogrulaV2(string tcKimlikNo)
{
    bool returnvalue = false;
    if (tcKimlikNo.Length == 11)
    {
        Int64 ATCNO, BTCNO, TcNo;
        long C1,C2,C3, C4, C5,C6,C7,C8, C9,Q1,Q2;
 
        TcNo = Int64.Parse(tcKimlikNo);

	// bolu yuz islemi int tanimlanmis degiskende son 2 haneyi silmek icin kullanılır.
 
        ATCNO = TcNo / 100;
        BTCNO = TcNo / 100;
 
         C1 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C2 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C3 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C4 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C5 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C6 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C7 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C8 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C9 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         Q1 = ((10-((((C1+C3+C5+C7+C9)*3)+(C2+C4+C6+C8))%10))%10);
         Q2 = ((10-(((((C2+C4+C6+C8)+Q1)*3)+(C1+C3+C5+C7+C9))%10))%10);

         /*
         Q1 TC nosunun 10. hanesi
         Q2 TC nosunun 11. hanesi
         BTCNO son 2 hanesi olmayan tckimlikNo
         */ 

         returnvalue = ((BTCNO * 100)+(Q1 * 10)+Q2 == TcNo);
    }
    return returnvalue;
}

Vb.Net

Function TcDogrulaV2(ByVal tcKimlikNo As String) As Boolean
    Dim returnvalue As Boolean = False
    If (tcKimlikNo.Length <> 11) Then
        tcCustom.ErrorMessage = "<br>TC Kimlik Numarası 11 Haneli Olmalıdır."
        Return returnvalue
    End If
    Dim TcNo As Long = Long.Parse(tcKimlikNo)
    Dim BTCNO As Long = Long.Parse(Left(tcKimlikNo, 9))
         
    Dim C1 As Long = Long.Parse(Mid(tcKimlikNo, 1, 1))
    Dim C2 As Long = Long.Parse(Mid(tcKimlikNo, 2, 1))
    Dim C3 As Long = Long.Parse(Mid(tcKimlikNo, 3, 1))
    Dim C4 As Long = Long.Parse(Mid(tcKimlikNo, 4, 1))
    Dim C5 As Long = Long.Parse(Mid(tcKimlikNo, 5, 1))
    Dim C6 As Long = Long.Parse(Mid(tcKimlikNo, 6, 1))
    Dim C7 As Long = Long.Parse(Mid(tcKimlikNo, 7, 1))
    Dim C8 As Long = Long.Parse(Mid(tcKimlikNo, 8, 1))
    Dim C9 As Long = Long.Parse(Mid(tcKimlikNo, 9, 1))
         
    Dim Q1 As Long = ((10 - (((((((C1 + C3) + C5) + C7) + C9) * 3) + (((C2 + C4) + C6) + C8)) Mod 10)) Mod 10)
    Dim Q2 As Long = ((10 - (((((((C2 + C4) + C6) + C8) + Q1) * 3) + ((((C1 + C3) + C5) + C7) + C9)) Mod 10)) Mod 10)
    'Response.Write((((BTCNO * 100) + (Q1 * 10)) + Q2) & " - ")
    'Response.Write(tcKimlikNo)
    If ((((BTCNO * 100) + (Q1 * 10)) + Q2) = TcNo) Then
        tcCustom.ErrorMessage = ""
    Else
        tcCustom.ErrorMessage = "<br>Hatalı TC Kimlik Numarası."
    End If
       
    Return ((((BTCNO * 100) + (Q1 * 10)) + Q2) = TcNo)
End Function

Javascript

function check_tcno(a){
  if(a.substr(0,1)==0&&a.lenght!=11){
    return false;
  }
  var i = 9, md='', mc='', digit, mr='';
  while(digit = a.charAt(--i)){
    i%2==0 ? md += digit : mc += digit;
  }
  if(((eval(md.split('').join('+'))*7)-eval(mc.split('').join('+')))%10!=parseInt(a.substr(9,1),10)){
    return false;
  }
  for (c=0;c<=9;c++){
    mr += a.charAt(c);
  }
  if(eval(mr.split('').join('+'))%10!=parseInt(a.substr(10,1),10)){
    return false;
  }
  return true;
}

PHP

// with pattern
function check_tcno($tcno) {
        preg_replace('/([1-9]{1})([0-9]{1})([0-9]{1})([0-9]{1})([0-9]{1})([0-9]{1})([0-9]{1})([0-9]{1})([0-9]{1}).*$/e', "eval('\$on=((((\\1+\\3+\\5+\\7+\\9)*7)-(\\2+\\4+\\6+\\8))%10); \$onbir=(\\1+\\2+\\3+\\4+\\5+\\6+\\7+\\8+\\9+\$on)%10; \$sonIki = \$on.\$onbir;')", $tcno);
        return(substr($tcno, -2) == $sonIki);
}

// spagetti
function _tcNoCheck($tcNo){
    // For Controller
    $isDouble = is_double($tcNo);
    $size     = strlen($tcNo);
    $type     = gettype($tcNo);
              
    // First Controller
    if($tcNo == "" || $tcNo == null || $tcNo == 0){
        return false; //Bu alan boş bırakılamaz!
    }else if($size != 11 && $type != "integer"){            
        // Data Type Size Controller
        return false; //T.C. kimlik no 11 haneli olmak zorundadır!
    }else if($type == "integer"){
        // Type convert controller
        return false; //T.C. kimlik no 0(sıfır) ile başlayamaz ve 11 hane olmak zorundadır!
    }else if($isDouble != true) {
        // Data Type Controller
        return false; //T.C. kimlik no sadece sayısal girilmelidir!
    }else{
        // TC NO's
        $tc1;$tc2;$tc3;$tc4;$tc5;$tc6;
        $tc7;$tc8;$tc9;$tc10;$tc11;
              
        $tc1 = substr($tcNo,0,1);
        $tc2 = substr($tcNo,1,1);
        $tc3 = substr($tcNo,2,1);
        $tc4 = substr($tcNo,3,1);
        $tc5 = substr($tcNo,4,1);
        $tc6 = substr($tcNo,5,1);
        $tc7 = substr($tcNo,6,1);
        $tc8 = substr($tcNo,7,1);
        $tc9 = substr($tcNo,8,1);
        $tc10 = substr($tcNo,9,1);
        $tc11 = substr($tcNo,10,1);
  
        //First Algo. Checks
        $algoCheck1 = (($tc1 + $tc3 + $tc5 + $tc7 + $tc9) * 7);
        $algoCheck2 = abs(((($tc2 + $tc4 + $tc6 + $tc8) - $algoCheck1) % 10));
        $algoCheck3 = (($tc1 + $tc2 + $tc3 + $tc4 + $tc5 + $tc6 + $tc7 + $tc8 + $tc9 + $tc10) % 10); 
                  
        if($algoCheck2 != $tc10){
            return false; //Geçersiz T.C. kimlik no!!!
        }
                 
        if($algoCheck3 != $tc11){
            return false; //Geçersiz T.C. kimlik no!!!
        }
    }
              
        //GEÇERLİ T.C. Kimlik No.>";
        return true;
 }

//kisaltilmis (ev makarnasi :p)

function is_valid_tckn( $tckn )
{
    $x = $tckn;
    $valid1=((7*($x[0]+$x[2]+$x[4]+$x[6]+$x[8])-($x[1]+$x[3]+$x[5]+$x[7]))%10)==$x[9];
    $valid2=(($x[0]+$x[1]+$x[2]+$x[3]+$x[4]+$x[5]+$x[6]+$x[7]+$x[8]+$x[9])%10)==$x[10];
    return $valid1 && $valid2;
}

Delphi

Function TCKimlikDogrula(TCNo : String) : Boolean;
var
 bir,iki,uc,dort,bes,alti,yedi,sekiz,dokuz,onn,onbir,
 ilk,son,onuncu,onbirinci :  integer;
 _Soniki, pSoniki : string;
begin
 if (Length(TCNo) < 11) or (Length(TCNo) > 11 ) then
  begin
     ShowMessage('doğru düzgün gir tc no nu !!');
     Abort
  end
   else
 bir := StrToInt(TCNo[1]);
 iki := StrToInt(TCNo[2]);
 uc  := StrToInt(TCNo[3]);
 dort:= StrToInt(TCNo[4]);
 bes := StrToInt(TCNo[5]);
 alti:= StrToInt(TCNo[6]);
 yedi:= StrToInt(TCNo[7]);
 sekiz:= StrToInt(TCNo[8]);
 dokuz:= StrToInt(TCNo[9]);
 onn  := StrToInt(TCNo[10]);
 onbir:= StrToInt(TCNo[11]);
 
 ilk := (bir+uc+bes+yedi+dokuz) * 7;
 son := iki+dort+alti+sekiz;
 onuncu := (ilk - son) mod 10;
 onbirinci := (bir+uc+bes+yedi+dokuz+iki+dort+alti+sekiz+onuncu);
 onbirinci := onbirinci mod 10;
 
 _Soniki := IntToStr(onuncu) + IntToStr(onbirinci);
 pSoniki := TCNo[10] + TCNo[11];
 
 if _Soniki = pSoniki then
  begin
   Result := True;
  end
   else
    Result := False;
end;

Python

# -------------------------------------------------------------------------
# tc numarasının checksum kısmını hesaplayan kısım
def tcno_checksum(tcno):
    tc    = '%d' % tcno
    tc10  = int(tc[0]) + int(tc[2]) + int(tc[4]) + int(tc[6]) + int(tc[8])
    tc10 *= 7
    tc10 -= int(tc[1]) + int(tc[3]) + int(tc[5]) + int(tc[7])
    tc10 %= 10
 
    tc11  = int(tc[0]) + int(tc[1]) + int(tc[2]) + int(tc[3]) + int(tc[4])
    tc11 += int(tc[5]) + int(tc[6]) + int(tc[7]) + int(tc[8]) + int(tc10)
    tc11 %= 10
 
    return '%s%d%d' % (tc, tc10, tc11)

Tsql

CREATE PROCEDURE [dbo].[tckimliknoDogrulama]

(

@TCKimlikNo nvarchar(11)

)

AS

SET NOCOUNT ON

if @TCKimlikNo is null

begin

return 'false'

end

if LEN(@TCKimlikNo) <> 11

begin

return 'false'

end

--Sayi mi degil mi kontrolu

declare @count int

select @count=1

while @count<=LEN(@TCKimlikNo)

begin

if substring(@TCKimlikNo,@count,1)<>'0' and substring(@TCKimlikNo,@count,1)<>'1' and substring(@TCKimlikNo,@count,1)<>'2'

and substring(@TCKimlikNo,@count,1)<>'3' and substring(@TCKimlikNo,@count,1)<>'4' and substring(@TCKimlikNo,@count,1)<>'5'

and substring(@TCKimlikNo,@count,1)<>'6' and substring(@TCKimlikNo,@count,1)<>'7' and substring(@TCKimlikNo,@count,1)<>'8'

and substring(@TCKimlikNo,@count,1)<>'9'

begin

return 'false'

end

select @count= @count+1

end

--Cift mi degil mi kontrolu

if (substring(@TCKimlikNo,LEN(@TCKimlikNo),1)<>'0' and

substring(@TCKimlikNo,LEN(@TCKimlikNo),1)<>'2' and

substring(@TCKimlikNo,LEN(@TCKimlikNo),1)<>'4' and

substring(@TCKimlikNo,LEN(@TCKimlikNo),1)<>'6' and

substring(@TCKimlikNo,LEN(@TCKimlikNo),1)<>'8' )

begin

return 'false'

end

declare @tmp1 bigint,@tmp bigint,@asb nvarchar(9),@str nvarchar(5)

select @tmp1= convert(bigint,@tckimlikno)/100, @tmp= convert(bigint,@tckimlikno)/100

select @count =9,@asb=''

while @count>0

begin

select @str=substring(@TCKimlikNo,@count,1)

select @asb=@asb+@str

select @count = @count -1

end

declare @oddsum bigint,@evensum bigint,@evensumtot bigint,@oddsumtot bigint,@total bigint,@chkdigit1 bigint,@chkdigit2 bigint

SELECT @oddsum=convert(bigint,(substring(@asb,1,1)))+convert(bigint,(substring(@asb,3,1)))+convert(bigint,(substring(@asb,5,1)))+convert(bigint,(substring(@asb,7,1)))+convert(bigint,(substring(@asb,9,1)))

SELECT @evensum=convert(bigint,(substring(@asb,2,1)))+convert(bigint,(substring(@asb,4,1)))+convert(bigint,(substring(@asb,6,1)))+convert(bigint,(substring(@asb,8,1)))

select @oddsumtot=@oddsum,@evensumtot=@evensum

select @total=@oddsum*3+@evensum

select @chkdigit1= (10-@total%10)%10

select @oddsum= @chkdigit1+@evensumtot

select @evensum= @oddsumtot

select @total = @oddsum*3+@evensum

select @chkdigit2=(10-@total%10)%10

select @tmp =@tmp*100+@chkdigit1*10+@chkdigit2

if @tmp <> convert(bigint,@tckimlikno)

begin

return 'false'

end

else

begin return 'true'

end

RETURN

 

9Eyl/142

IMEI – Kredi Kart Numarası Hesaplama – Doğrulama

Merhabalar, Şuan Iphone6 canlı yayında tanıtılıyor ama internet yayını çok kotu izlenmiyor... Uzun zamandır yazmıyorum. İş güç değişimler zamansızlık dan öte kendime zaman ayırma lüksümün olmadığını düşündüğümden yazmıyordum belkide. Gevezeyim yazdığımda uzuyıp gidiyor. Fazla uzatmadan konuya geleyim.

Bir arkadaş az önce aradı MOD10 Kart no hesaplama diye bir şey varmış sen bilirsin. Eeee bilirim de ? dememe kalmadan bilirim dediğim an bana o lazım diye geldi istek. mod10 olarak arkadaşın söylediği şey aslında Luhn Algorithm (Luhn Algoritması)

Kısa tarih bilgisi ile bir alman olan Hans Peter Luhn abimiz tarafından 1954 yılında dakte edilen sayıların yanlış girilip girilmediğini kontrol amaclı geliştirilmiş. IMEI - Kredikarti gibi sayıların son karakterinde doğrulama kodu olarak kullanılır.

Kendi kullandığım fonksiyonları paylaşmak istemedim. Bir googlelayım dedim. 2-3 sayfada karsıma kodtarifi diye bir siteden makale çıktı.

using System;
using System.Linq;
//Credit Card Check Digit - Luhn Algorithm
namespace LuhnAlgorithm
{
    class Program
    {
        static void Main(string[] args)
        {
           string ccNo = "4022999999994026";
           bool sonuc = IsLuhnValid(ccNo);//Parametre olarak k.k numarası geçilir.
        }

        public static bool IsLuhnValid(string value)
        {
            return value.Where(c => Char.IsDigit(c)).Reverse()
              .SelectMany((c, i) => ((c - '0') << (i & 1)).ToString())
              .Sum(c => c - '0') % 10 == 0;
        }
    }
}

kullanım seklide :

string ccNo = "4022999999994026";
bool sonuc = IsLuhnValid(ccNo);//Parametre olarak k.k numarası geçilir.
if(!sonuc)
 Console.WriteLine("Kart numarası hatalı!");
else
 Console.WriteLine("Kart numarası doğru.");

Sayfanın üst kısmından gördüm ki sitenin sahibi Fulya hanım mış, paylaştığı kod için teşekkür ederim. Kendisi iş hayatından tanıdığım ve aynı projede görev aldığım bir insan.

Bu arada kendi kodumu paylaşmama nedenim çok gizli özel kapalı saklama kabında hatta banka kasasında saklanması gereken bir kod olduğundan değil. Bayağı eskiden kalma iş görecek kadar yazılmış bir kod olmasından dolayı. Ebem dedem misali düz ve gerektiği kadar kod yazan bir insanim. Türemeler Miraslar kalıtımlar günümüzde gereksiz fazla kullaniliyor bence. Hala entity framework yerine kendi dbHelper sinifi uzerinden db işlemlerini yürüten birisi olarak yeterince dinazor olduğumu belirterek kendi kodumuda buraya ekliyim :

        public string LuhnCheck(string cardNumber)
        {
            int total = 0;
            int power = 2;

            for (int i = cardNumber.Length - 2; i >= 0; i += -1)
            {
                int res = Convert.ToInt32(cardNumber.Substring(i, 1)) * power;
                if (res >= 10)
                    res -= 9;
                total += res;
                power = power ^ 3;
            }

            total = 10 - (total % 10);
            if (total != 10)
            {
                return total.ToString();
            }
            else
            {
                return "0";
            }
        }

burdaki kodun calisma mantigi son karakteri hesaplama

string strCardNo = BIN + strSelectedCardNoPad.PadLeft(7, '0').Substring(0, 7);
string chrChckDjt =  LuhnCheck(strCardNo + "0");
return strCardNo + chrChckDjt;

Şeklinde de bir yerde kullanmışım mesela. BIN kodu kart'a ait Patentli seri no başlangıç bölümü. Sonrasında gerekli hesaplamaları yapıp üretilen 15 haneli kart numarasına son karakter eklenerek toplam 16 haneli kart numarası elde ediliyor.

Bu kodu verip bitirmek olmamalı; Mantığınıda anlatmaya çalışıyım.

Örnek kart No : 4022999999994026
bunda numaraları 1'er atlayarak grupluyoruz, Yukarda Kalın ve Kırmızılar diye iki grup oluştu.

Kalınları (ilk karakteri ve 1'er atlanmış halini) 2 ile carpıyor çift hane çikarsa bir sonucun onlar ve birler basamağını topluyoruz. Kırmızıları ise direk topluyoruz.

4 x 2 2 x 2 9 x 2 9 x 2 9 x 2 9 x 2 4 x 2 2 x 2
8 4 18 -> 1+8 18 -> 1+8 18 -> 1+8 18 -> 1+8 8 4
8 4 9 9 9 9 8 4

8 + 4 + 9 + 9 + 9 + 9 + 8 + 4 = 60 ilk cift sonucu

0 + 2 + 9 + 9 + 9 + 9 + 0 + 644

60 + 44 = 104

104 Mod 10 = 4

Luhn algoritmasina Mod10 yada Modulus 10 algoritmasi denmesinin sebebi bu işlemler bittiginda olusan sonucun Mod10 yapıldığında 0 kalması gerekmekte olmasıdır. Yani hesapladigimiz Kart no Luhn algoritmasina uymuyor Mod10 da sonuc 4 kaliyor. son karakter 6 degil 2 olsa toplamda 4 değer duşeceğinden Luhn algoritmasına uygun kod elde etmiş olacaktık.

Online kontrol ve test yapmak isteyen olursa : http://planetcalc.com/2464/ adresinde hazir bir tane mevcut. Luhn degeri 0 tutturmaya calişcaksınız.
Her türlü Akıllı kart ürünü Yoroca tarafından geliştirile bilir, Aklınızda bulunsun, belki gerekir...

Toplam 26 sayfa mevcuttur; 6. sayfayi okuyorsunuz...« Ilk...345678910...20...Son »