Binary dosyadaki verilere uygun değişkenler bulma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ng
Üye
Mesajlar: 192
Kayıt: 01 Mar 2004 11:49
Konum: Bursa
İletişim:

Binary dosyadaki verilere uygun değişkenler bulma

Mesaj gönderen ng »

Kod: Tümünü seç

Item Name Position	Bytes	Description 	Remarks	
BarNO.    00-06          7	PLU barcode 	13 characters BCD
Name      07-24          18	Name	         Double width characters with 2 BYTES	
LINK DEP     25          1	Link department	0-99,0 means no effects	
PLU Price 26-30          5	PLU price	10 numbers at most	
MemberF	  31          	1	Member index	Range 0~4 
Stock     32-35          	4	Stock	3 decimal digits	
Yukarıda gösterilen şekilde binary dosya var bunun içindeki bilgileri, kendi oluşturduğum tabloya aktarma istiyorum.
bunun için iki yol kullandım

Kod: Tümünü seç

     Binary dosya olarak açarak:
                 Dosyayı açıyorum ancak yukarıdaki verilere uygun           
                  değişkenler tanımlamadığım için olsa gerek içeriğini  
                  okuyamıyorum.
                 Yukarıdaki verilre uygun bir record oluşturmak istiyorum 
                 değişkenler ne olmalıdır?
    TClientDataset nesnesi ile:
                Clientdataset nesnesine alanlaı oluşturuyorum loadfromfile ile 
                 verileri yüklemye çalıştığımda Type mismatch hatası veriyor.
               Yukarıdaki dosyayı TClientDataset ile açmak için alanları ne 
                 şekilde tanımlamalıyım.
Her iki şekilde de temel sorun verileri uygun değişkenler ile ifade etmek ama 7 Bytelık 13 karakterden oluşan bir BCD tipi nasıl gösterebilirim.
Gerçi TBCD diyebir değişken türü var ama onunla da denedim olmuyor. Yada alan içerisinde i BAYT lık sayı var o sayıyı ne şekilde alabilirim.
Yardımlarınız için teşekkürler.
Bu arada forumda zatena rama yaptım.
ng
Üye
Mesajlar: 192
Kayıt: 01 Mar 2004 11:49
Konum: Bursa
İletişim:

Mesaj gönderen ng »

Yada diğer bir yöntem tüm veriyi Blockread ile okutmak. böyle yapınca da hafızadaki verilere nasıl ulaşacağımı bilmiyorum. Mesela a değişkeni içerisindeki 15 ve 17 bytteaki verilere nasıl ulaşabilirim.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Kod: Tümünü seç

var
  barcode:?;
  name:WideString
begin
  with TFileStream.Create('Dosya ismi',fmOpenRead) do
  begin
    Read(barcode, 7);
    Read(name, 18);
    .
    .
    .
  end;
BCD sayı icin ne kullanılır bilmiyorum ama boyle bir yapı ile tekerteker okuyabilirsin
ÜŞENME,ERTELEME,VAZGEÇME
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Tabii ki string veya pchar türlerini kullanıyorsan stream'den okutmadan önce okuttuğun boyut kadar değişkenlere bellek ayırman lazım.

string için SetLength ile bellek ayırırsın. ve stream'den okuturken Read(VString[1] ... ile ilk karakterin adresini vermen gerekir.

keza PCHAR ise GetMem ile bellek ayırman gerekir.

gkimirti yazdı:

Kod: Tümünü seç

var
  barcode:?;
  name:WideString
begin
  with TFileStream.Create('Dosya ismi',fmOpenRead) do
  begin
    Read(barcode, 7);
    Read(name, 18);
    .
    .
    .
  end;
BCD sayı icin ne kullanılır bilmiyorum ama boyle bir yapı ile tekerteker okuyabilirsin
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Kod: Tümünü seç

Item Name Position   Bytes   Description     Remarks
BarNO.    00-06          7   PLU barcode     13 characters BCD
Name      07-24         18   Name            Double width characters with 2 BYTES
LINK DEP     25          1   Link department 0-99,0 means no effects
PLU Price 26-30          5   PLU price       10 numbers at most
MemberF      31          1   Member index    Range 0~4
Stock     32-35          4   Stock           3 decimal digits
:idea: Ben olsam yukardaki gibi bir yapı ile karşılaşsaydım, başlangıç noktası olarak her veri bloğunu, karakter katarıymış gibi düşünerek okutur ve anlamsız dönen sonuçlara ait veri elemanı üzerinde tanım değişikliği yaparak anlam vermeye çalışırdım... Şöyle ki ...

:arrow: Yukardakiler ışığındaki başlangıç Type bloğum aşağıdaki gibi olurdu...

Kod: Tümünü seç

Type TVeri = Packed Record
  aBarNo   : Array[0..06] of Char; //  7 Byte
  bName    : Array[0..17] of Char; // 18 Byte
  cLinkDep : Char;                 //  1 Byte
  dPluPice : Array[0..04] of Char; //  5 Byte
  eMemberF : Char;                 //  1 Byte
  fStrock  : Array[0..03] of Char; //  4 Byte
end;
:arrow: Başlarına a,b,c,d,e,f koydum ki TVeri. dediğinde Delphi IDE kod tamamlama karşına bunları aynı sırayla getirsin. :wink:

:arrow: Okumadan önce bu veri bloğu başlangıcına dair bilgi edinirdim. Çünkü verilere başlamdan genelde bir Header (başlık) tanımı olur. Verinin başına kadar seek ile atlayıp sonra blockread ile okurdum...

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
Var
  Okunan: TVeri;
  Dosya : File;
begin
  AssignFile(Dosya, 'c:\veri.dat');
  FileMode := 0; // Readonly açıcaz...
  Reset(Dosya, 1);
  // verilerin 12dec offset'ten başladığını varsayarsak...
  Seek(Dosya, 12); //
  Repeat
    BlockRead(Dosya, Okunan, SizeOf(Okunan));
    // Burada okunan veriyle ne yapmak istersek yapabiliriz...
    {
    Okunan.aBarNo
    Okunan.bName
    Okunan.cLinkDep
    Okunan.dPluPice
    Okunan.eMemberF
    Okunan.fStrock
    }
  Until EOF(Dosya);
  CloseFile(Dosya);
end;
:idea: Umarım bir yol haritası çıkarabilmişimdir... Çalışmalarında başarılar...
Resim
Resim ....Resim
ng
Üye
Mesajlar: 192
Kayıt: 01 Mar 2004 11:49
Konum: Bursa
İletişim:

Mesaj gönderen ng »

yardımlarınız için teşekkürler aşağıdaki gibi bir yazı buldum onu deneyrek sonuca ulaşmaya çalışacam.........


1. for BCD code transfer, for example 6912345678912 (13 digits) be
transfered to BCD code(7 bytes hex) should be 06 91 23 45 67 89 12.
2. for ASCII code transfer will no problem.
3. for Binary code transfer, you can refer to below message.
In our ECR, for binary data format is as follows:
5 bytes= 4 bytes + 1 byte
6 bytes= 4 bytes + 2 byte
8 bytes= 4 bytes + 4 byte

For example, decimal data 123456 were save as 5 bytes binary data will
as follows:
final 1 bytes will be 56, convey to hex data is 38
first 4 bytes will be 1234, convey to hex data is 00 00 04 D2
so decimal 123456 save in 5 bytes to hex data will be 00 00 04 D2 38.

If it (123456)were saved into 6 bytes:
final 2 bytes will be 3456, convey to hex data is 0D 80
first 4 bytes will be 12, convey to hex data is 00 00 00 0C
so decimal 123456 save in 6 bytes to hex data will be 00 00 00 0C 0D
80.
4.PC s/w could transfer file to download file format( under temp
directory), you could refer to these files and file format.doc which we have
given before.
Kullanıcı avatarı
skyking
Üye
Mesajlar: 136
Kayıt: 09 Kas 2005 12:52
Konum: Antalya

Mesaj gönderen skyking »

arkadaslar olivetti yazar kasanın
binary cevrimi asagıdaki gibi algoritma kurunca tl modunda iken dogru
3. for Binary code transfer, you can refer to below message.
In our ECR, for binary data format is as follows:
5 bytes= 4 bytes + 1 byte
6 bytes= 4 bytes + 2 byte
8 bytes= 4 bytes + 4 byte

For example, decimal data 123456 were save as 5 bytes binary data will
as follows:
final 1 bytes will be 56, convey to hex data is 38
first 4 bytes will be 1234, convey to hex data is 00 00 04 D2
so decimal 123456 save in 5 bytes to hex data will be 00 00 04 D2 38.

If it (123456)were saved into 6 bytes:
final 2 bytes will be 3456, convey to hex data is 0D 80
first 4 bytes will be 12, convey to hex data is 00 00 00 0C
so decimal 123456 save in 6 bytes to hex data will be 00 00 00 0C 0D
80.
4.PC s/w could transfer file to download file format( under temp
directory), you could refer to these files and file format.doc which we have

bunu olivettin kendi programında bakıyorum ve hex editor ile karşılaştırdım mesella 5 byte alana 123456 yazdıgımda 00 00 04 D2 38. yazıyor

ama yeni lira modunda iken 123456 yazdıgımda 4995E40000 cıkıyor burdaki algoritmayı bilen varmı acaba 3 gundur tırmalıyorum
yardımcı olursanız çok sevirim arkadaşlar
Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

BCD Binary-coded decimal yani her byte da iki basmak tutuluyor
Cevapla