Tüm Platformlar için Hızlı Uygulama Geliştirme --->    Kitabımız...      Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
DateTime To ByteArray / ByteArray to DateTime
#1
Çok araştırdım Bulamadım. Tarih ve Saat değerlerini byte array ve byte arrayden Tarih ve Saat değerlerinin çevrimi ile alakalı bilgi verebilecek örnek gösterebilecek var mı? Teşekkürler

Delphi Türkiye Forumuna da yazmıştım. Oradan Aldığım Cevap ve Yanıtım:

SimaWB Adlı Kullanıcıdan Alıntı:TDateTime aslında Double tipinde bir veridir. Yani 8 byte'lık bir sayıdır. 
Dolayısıyla 8 byte'lık bir byte array'a kopyalabilirsiniz.
Kod:
var
  dt: TDateTime;
  buf: array[0..7] of Byte;
begin
  dt := Now;
  Move(dt, buf[0], SizeOf(dt));

Daha sonra buf'ı TDateTime(buf) şeklinde dönüşüm yapıp kullanabilirsiniz.

Muhtemelen başka yöntemleri de vardır ama benim ilk aklıma bu geldi.

Yönteminizi denedim. ByteArray e geçişte sıkıntı yok. Yalnız ByteArray den çevirim yapamadım. Çevrim yapmak istediğim ByteArray de TArray(Byte) tipinde... 

Bunların Işığında Önerilerinizi, Çözümlerinizi Bekliyorum. Teşekkürler. İyi Çalışmalar...
Cevapla
#2
O zaman buradan devam edelim Smile
Problemi tam olarak anlayamadım ?
There's no place like 127.0.0.1
WWW
Cevapla
#3
(01-06-2017, Saat: 09:23)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlO zaman buradan devam edelim Smile
Problemi tam olarak anlayamadım ?

Problemim şu tarih ve saat bilgisini içeren iki farkli TArray<Byte> tipinde dizi var. Tarih dizisini tarih olarak, saat dizisini de saat olarak çevirmek istiyorum.

örnek diziler : 
bcdTicketDate: TArray<Byte> = (70,119,85,120) 
bcdTicketTime : TArray<Byte> =(69,81,89,83)
Cevapla
#4
var
tarih: TDate;
saat: TTime;
begin
  Move( bcdTicketDate[0], tarih, SizeOf(tarih));
  Move( bcdTicketTime[0], saat, SizeOf(saat));
 
  Memo1.Lines.Add(FormatDateTime('dd/mm/yyyy', tarih));
  Memo1.Lines.Add(FormatDateTime('hh:nn', saat));
end;
There's no place like 127.0.0.1
WWW
Cevapla
#5
Thumbs Up 
İlginiz için çok teşekkürler. Yardım Edenleriniz bol olsun...  Smile

Yaptığım denemeyi paylaşıyorum. İhtiyacı olanlar faydalanabilsinler...  Wink
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TByteArr = TArray<Byte>;

  TForm2 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Memo2: TMemo;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    dt:TDateTime;
    d:TDate;
    t:TTime;

    fdtArr:TByteArr;
    fdArr:TByteArr;
    ftArr:TByteArr;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var i:Integer; s:string;
begin
  Memo1.Lines.Clear;

  dt := Now;
  d  := StrToDate(DateToStr(dt));
  t  := StrToTime(TimeToStr(dt));

  Label1.Caption := DateTimeToStr(dt);

  SetLength(fdtArr,SizeOf(dt));
  SetLength(fdArr,SizeOf(d));
  SetLength(ftArr,SizeOf(t));

  Move(dt,fdtArr[0],SizeOf(dt));
  Move(d ,fdArr[0] ,SizeOf(d));
  Move(t ,ftArr[0] ,SizeOf(t));

  s:='';
  for I := Low(fdtArr) to High(fdtArr) do
  s := s + ','+IntToStr(fdtArr[i]);

  Delete(s,1,1);
  Memo1.Lines.Add('fdtArr=('+s+')');

  s:='';
  for I := Low(fdArr) to High(fdArr) do
  s := s + ','+IntToStr(fdArr[i]);

  Delete(s,1,1);
  Memo1.Lines.Add('fdArr=('+s+')');


  s:='';
  for I := Low(ftArr) to High(ftArr) do
  s := s + ','+IntToStr(ftArr[i]);

  Delete(s,1,1);
  Memo1.Lines.Add('ftArr=('+s+')');
end;

procedure TForm2.Button2Click(Sender: TObject);
var i:Integer;
begin
  Memo2.Lines.Clear;

  Move(fdtArr[0],dt,SizeOf(dt));
  Move(fdArr[0] ,d ,SizeOf(d));
  Move(ftArr[0] ,t ,SizeOf(t));

  Memo2.Lines.Add(DateTimeToStr(dt));
  Memo2.Lines.Add(DateToStr(d));
  Memo2.Lines.Add(TimeToStr(t));
end;

end.
Cevapla
#6
bcdTicketDate: TArray<Byte> = (70,119,85,120)
bcdTicketTime : TArray<Byte> =(69,81,89,83)

Yukarıdaki dizileri örnek uygulama ile çevirim yapmak istediğimde dizi değerleri tarih ya da saat olarak çözülemiyor. Delphi deki TDate,TTime,TDateTime tipleri 8 byte,fakat bu diziler 4 byte değer içeriyor. Bu dizilerin çevrimini nasıl yapabilirim?  Sad
Cevapla
#7
4 byte olduklarına göre bir şeyler eksik. Hangi kısım eksik bizim bilme şansımız yok. Bu verileri nasıl temin ettiğinize göre değişir. Bunları bulan sizseniz, geri dönüşüm yolunu da biliyor olmalısınız.

Not: Eksik demek yanlış olur. Farklı format/protokol kullanılmış diyelim. Bu format kurallarını bilmeden dönüşüm yapamayız. Mesela; TDateTime'in yıl kısmını 2 byte'a bölmüş, bunlarda sizin bcdTicketDate'in ilk 2 byte'ı olabilir. Bunu gibi farklı yöntemle bu 4 byte elde edilmişse, nasıl elde edildiğini bilmek zorundayız.
There's no place like 127.0.0.1
WWW
Cevapla
#8
Bu cevaplar eft-pos tan gelen bilgiler. Eft-posun satış sonunda doldurduğu satış bilgileri içindeki tarih - saat değerleri.
Cevapla
#9
Eklediğim not kısmına bakınız.
There's no place like 127.0.0.1
WWW
Cevapla
#10
Alıntı:Yazan SimaWB - 50 dakika önce

4 byte olduklarına göre bir şeyler eksik. Hangi kısım eksik bizim bilme şansımız yok. Bu verileri nasıl temin ettiğinize göre değişir. Bunları bulan sizseniz, geri dönüşüm yolunu da biliyor olmalısınız.



Not: Eksik demek yanlış olur. Farklı format/protokol kullanılmış diyelim. Bu format kurallarını bilmeden dönüşüm yapamayız. Mesela; TDateTime'in yıl kısmını 2 byte'a bölmüş, bunlarda sizin bcdTicketDate'in ilk 2 byte'ı olabilir. Bunu gibi farklı yöntemle bu 4 byte elde edilmişse, nasıl elde edildiğini bilmek zorundayız.

 Demek istediğinizi anladım. Araştırıyorum.

(01-06-2017, Saat: 13:57)erkankurtaga Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Alıntı:Yazan SimaWB - 50 dakika önce

4 byte olduklarına göre bir şeyler eksik. Hangi kısım eksik bizim bilme şansımız yok. Bu verileri nasıl temin ettiğinize göre değişir. Bunları bulan sizseniz, geri dönüşüm yolunu da biliyor olmalısınız.



Not: Eksik demek yanlış olur. Farklı format/protokol kullanılmış diyelim. Bu format kurallarını bilmeden dönüşüm yapamayız. Mesela; TDateTime'in yıl kısmını 2 byte'a bölmüş, bunlarda sizin bcdTicketDate'in ilk 2 byte'ı olabilir. Bunu gibi farklı yöntemle bu 4 byte elde edilmişse, nasıl elde edildiğini bilmek zorundayız.

 Demek istediğinizi anladım. Araştırıyorum.

Konuyu araştırdım. Dediğiniz gibi ;

bcdTicketDate: TArray<Byte> = (70,119,85,120) => YYMMDD
bcdTicketTime : TArray<Byte> =(69,81,89,83) => HHMMSS
Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi