一種變長數(shù)據(jù)存取方法
【專利摘要】本發(fā)明公開一種變長數(shù)據(jù)存取方法,在數(shù)據(jù)存儲階段,將變長數(shù)據(jù)分割為多個含固定字節(jié)的數(shù)據(jù)段,并對所述多個數(shù)據(jù)段進行封裝得到多個包含固定字節(jié)的數(shù)據(jù)包;依次將多個數(shù)據(jù)包存入確定好的存儲塊中,且保證同一條變長數(shù)據(jù)存儲在同一個存儲塊內(nèi)。在數(shù)據(jù)讀取階段,首先獲取所述變長數(shù)據(jù)的起始地址和終止地址,接下來去除所述存儲塊塊尾的冗余數(shù)據(jù),計算實際已用存儲空間,并按照固定長度讀取所述存儲塊中的數(shù)據(jù),直至讀取至終止地址時結(jié)束。本發(fā)明采用變長存儲、定長讀取的方式,既滿足數(shù)據(jù)發(fā)展的需求,又節(jié)約硬件成本,無需改裝舊有的定長數(shù)據(jù)讀取設(shè)備,從而延長了已有設(shè)備的使用期限,有利于節(jié)約成本、提高效率。
【專利說明】一種變長數(shù)據(jù)存取方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)讀寫方法【技術(shù)領(lǐng)域】,特別涉及一種利用定長設(shè)備對變長數(shù)據(jù)進行讀寫操作的方法。
【背景技術(shù)】
[0002]隨著國稅業(yè)務(wù)的拓展,大量服務(wù)于企業(yè)端的舊款稅控設(shè)備無法滿足開具變長發(fā)票的存儲要求,若全部更換為新設(shè)備,會給企業(yè)用戶造成沉重的負(fù)擔(dān),同時大規(guī)模升級設(shè)備也涉及人力、物力等資源的極大耗費。受限于設(shè)備硬件NandFlash存儲容量過小,以及兼容現(xiàn)有稅控系統(tǒng)發(fā)票明細(xì)定長報稅方式,因此,如何提供一種利用舊有稅控系統(tǒng)存取變長數(shù)據(jù)發(fā)票的方法,實為本領(lǐng)域技術(shù)人員亟待解決的問題。
【發(fā)明內(nèi)容】
[0003]本發(fā)明的目的是為了兼容目前變長數(shù)據(jù)發(fā)票的發(fā)展趨勢以及稅控系統(tǒng)定長報稅的方式,提供一種可靠性好且不需改造舊有設(shè)備的變長數(shù)據(jù)存取方法。
[0004]為達上述目的,本發(fā)明提供一種變長數(shù)據(jù)存取方法,包括數(shù)據(jù)存儲階段和數(shù)據(jù)讀取階段兩部分,所述數(shù)據(jù)存儲階段包括以下步驟:
[0005]Cl:將存儲介質(zhì)劃分為多個容量相等的存儲塊;
[0006]C2:將所述變長數(shù)據(jù)按照字節(jié)數(shù)分割為多個含固定字節(jié)的數(shù)據(jù)段,對所述多個數(shù)據(jù)段進行封裝,得到多個包含固定字節(jié)的數(shù)據(jù)包;所述多個數(shù)據(jù)包根據(jù)剩余長度分為首包、中間包和尾包,其中剩余長度是指位于當(dāng)前數(shù)據(jù)包之后的所有數(shù)據(jù)包的大小;
[0007]C3:計算所述存儲塊的剩余空間,根據(jù)剩余空間大小確定安放所述變長數(shù)據(jù)的存儲塊,以保證同一條變長數(shù)據(jù)存儲在同一個存儲塊內(nèi);
[0008]C4:將所述多個數(shù)據(jù)包依次存入確定好的存儲塊內(nèi);
[0009]所述數(shù)據(jù)讀取階段包括以下步驟:
[0010]Dl:獲取所述變長數(shù)據(jù)的起始地址和終止地址;
[0011]D2:去除所述存儲塊塊尾的冗余數(shù)據(jù),計算實際已用存儲空間;
[0012]D3:按照固定長度讀取所述存儲塊中的數(shù)據(jù);
[0013]D4:讀取至終止地址,數(shù)據(jù)讀取過程結(jié)束。
[0014]本發(fā)明提出的一種變長數(shù)據(jù)存取方法,其中,步驟C2中對所述數(shù)據(jù)包的格式為:
[0015]標(biāo)志位+數(shù)據(jù)總長度+剩余長度+數(shù)據(jù)段+校驗和
[0016]其中標(biāo)志位用于表示一個數(shù)據(jù)包的開始,數(shù)據(jù)總長度用于表示一條變長數(shù)據(jù)的總體長度,校驗和用于進行數(shù)據(jù)校驗。
[0017]本發(fā)明提出的一種變長數(shù)據(jù)存取方法,其中,所述步驟C3中確定存儲塊的方法為,比較存儲塊的剩余空間和要存儲的變長數(shù)據(jù)的大小,若剩余空間大于所述變長數(shù)據(jù)大小,則將所述變長數(shù)據(jù)存儲在所述存儲塊內(nèi);若剩余空間不足以存儲該變長數(shù)據(jù)的,該剩余空間將被舍棄,所述變長數(shù)據(jù)從下一個存儲塊的首部開始存儲;同時記錄被舍棄的剩余空間數(shù)。
[0018]本發(fā)明提出的一種變長數(shù)據(jù)存取方法,其中,所述步驟C4中還包括:判斷當(dāng)前數(shù)據(jù)包是否為首包,若是,重復(fù)步驟C3 ;若不是,直接存儲當(dāng)前數(shù)據(jù)包。
[0019]本發(fā)明提出的一種變長數(shù)據(jù)存取方法,其中,當(dāng)步驟C2中分割后的數(shù)據(jù)段長度不足預(yù)設(shè)的固定字節(jié)的,不足部分用O填補。
[0020]本發(fā)明提出的一種變長數(shù)據(jù)存取方法,其中,所述步驟D3中包括:讀取數(shù)據(jù)包中的標(biāo)志位,重新組裝原變長數(shù)據(jù)。
[0021]本發(fā)明提出的一種變長數(shù)據(jù)存取方法,其中,采用順序讀取或隨機讀取的方式讀取數(shù)據(jù)。
[0022]與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果在于:
[0023]通過本發(fā)明,使舊款稅控設(shè)備能夠支持變長發(fā)票存儲并兼容定長報稅方式,延長了已有設(shè)備的使用期限,滿足新需求的同時,也節(jié)省了硬件成本。本發(fā)明不需要存儲報稅臨時文件,節(jié)省空間,是一種高效的變長數(shù)據(jù)存取解決方案。
【專利附圖】
【附圖說明】
[0024]圖1為本發(fā)明的數(shù)據(jù)存儲過程流程圖;
[0025]圖2為本發(fā)明的數(shù)據(jù)讀取過程流程圖;
[0026]圖3為本發(fā)明數(shù)據(jù)存儲階段的一具體實施例的示意圖;
[0027]圖4為本發(fā)明數(shù)據(jù)讀取階段的一具體實施例的示意圖。
【具體實施方式】
[0028]以下結(jié)合附圖,就本發(fā)明上述的和另外的技術(shù)特征和優(yōu)點做進一步地說明。
[0029]根據(jù)本發(fā)明的技術(shù)方案,開具發(fā)票時,按照一定規(guī)則將變長發(fā)票明細(xì)數(shù)據(jù)裁切成固定大小的數(shù)據(jù)段,并將數(shù)據(jù)段封裝為數(shù)據(jù)包。數(shù)據(jù)包尺寸由接口軟件與固件程序約定,可設(shè)置為任何有意義的數(shù)值。在本發(fā)明的實施例中,該固定大小選擇為512字節(jié),即數(shù)據(jù)包的尺寸為512字節(jié)。
[0030]變長發(fā)票數(shù)據(jù)包格式如下:
[0031]發(fā)票標(biāo)志+發(fā)票數(shù)據(jù)總長度+剩余長度+發(fā)票數(shù)據(jù)(一個分?jǐn)?shù)據(jù)包,512字節(jié))+校驗和
[0032]寫入時根據(jù)剩余長度不同,將分割并封裝好的數(shù)據(jù)包又分為首包、中間包和尾包。剩余長度是指包括當(dāng)前數(shù)據(jù)包及其之后的所有數(shù)據(jù)包的大小。
[0033]所謂首包是指剩余長度等于變長發(fā)票數(shù)據(jù)的總長度,也即一條變長發(fā)票數(shù)據(jù)的第一個數(shù)據(jù)包;中間包是指剩余長度大于一個分?jǐn)?shù)據(jù)包的大小(512字節(jié));尾包是指剩余長度小于或等于一個分?jǐn)?shù)據(jù)包的大小(512字節(jié))。
[0034]上述分割方法可適用于任意長度的變長發(fā)票明細(xì)數(shù)據(jù),不需對發(fā)票明細(xì)數(shù)據(jù)進行修改,能夠保證數(shù)據(jù)的完整性和一致性;同時通過“剩余長度”字段標(biāo)示裁切下的每一個分片,可用于計算它與首包的偏移,也便于存取尋址,若拓展為網(wǎng)絡(luò)傳輸,也可用于數(shù)據(jù)包的排序和重傳。
[0035]整張發(fā)票明細(xì)數(shù)據(jù)在NandFlash存儲介質(zhì)上是連續(xù)存儲的,先尋找可用空間存儲發(fā)票明細(xì)數(shù)據(jù)的首包,存儲發(fā)票標(biāo)志,再通過“剩余長度”字段計算與首包的偏移,存儲獲取的剩余數(shù)據(jù)包。
[0036]值得一提的是,并非所有的變長發(fā)票數(shù)據(jù)都具有首包、中間包和尾包,當(dāng)變長發(fā)票數(shù)據(jù)長度不足時,可能會只包含首包或者只包含首包和尾包。如下所述:
[0037]只有首包的情況:寫入一張長度為436字節(jié)的發(fā)票明細(xì)數(shù)據(jù)時,只需要使用一個發(fā)票數(shù)據(jù)包(512字節(jié))。
[0038]首包和尾包的情況:寫入一張長度在513字節(jié)-1024字節(jié)的發(fā)票明細(xì)數(shù)據(jù)時,需要使用兩個數(shù)據(jù)包,首包512字節(jié),尾包1-512字節(jié)真實數(shù)據(jù),不足512字節(jié)的,空的位置填補O數(shù)據(jù),固件程序可以只存儲實際長度的數(shù)據(jù),也可以存儲填充過O的數(shù)據(jù),本文采用后一種方式,方便數(shù)據(jù)處理。
[0039]首包、中間包、尾包的情況:寫入一張長度在1024字節(jié)(512*2)以上的發(fā)票明細(xì)數(shù)據(jù)時,例如明細(xì)數(shù)據(jù)為4.9k,裁切為如下格式:首包0.5k字節(jié),8個0.5k字節(jié)的中間包,含有0.4k真實數(shù)據(jù)+0.1k填充O數(shù)據(jù)的尾包。
[0040]NandFlash存儲介質(zhì)容量為128M字節(jié),分為1024個BLOCK (塊),每個BL0CK128K字節(jié)。要求單張變長發(fā)票明細(xì)數(shù)據(jù)不能跨塊。當(dāng)某一 BLOCK中剩余存儲空間不足以存儲本張發(fā)票時,剩余存儲空間將被舍棄,從下一 BLOCK首部開始存儲。同時記錄塊內(nèi)被舍棄的剩余空間數(shù)(除以512字節(jié)),例如剩余4K字節(jié),記錄4K/512=8,便于報稅時組裝定長報稅數(shù)據(jù)。
[0041]圖1詳細(xì)描述了上述數(shù)據(jù)存儲過程的流程。開具完發(fā)票之后,首先對變長發(fā)票數(shù)據(jù)進行裁切,存儲時,先判斷要寫入的當(dāng)前數(shù)據(jù)包是否為首包,如是則需要計算塊內(nèi)剩余空間,以確定該變長數(shù)據(jù)存儲在那個存儲塊上,以保證一條變長發(fā)票數(shù)據(jù)位于同一個存儲塊內(nèi);如不是首包,則不需計算剩余空間,只需計算出存儲地址,直接將數(shù)據(jù)寫入指定的存儲塊中。
[0042]圖2給出了計算剩余空間、確定存儲塊的一個具體實施例。該實施例中,起始地址為某一塊首部,此塊中已存儲發(fā)票明細(xì)數(shù)據(jù)如下:0.5k字節(jié)、Ik字節(jié)、24.5k、60k、35k字節(jié)大小的發(fā)票,剩余7k字節(jié)。當(dāng)需要開具一張大小為8k字節(jié)的發(fā)票時,當(dāng)前BLOCK (塊)剩余空間不足,記錄7k的舍棄空間(7K/512=14),使用緊挨著的下一塊存儲8k字節(jié)的發(fā)票,SP8k發(fā)票明細(xì)數(shù)據(jù)首包存儲在下一 BLOCK (塊)首部,中間包及尾包的存儲地址根據(jù)該包與首包的偏移計算得出,依次存儲。
[0043]本發(fā)明的數(shù)據(jù)讀取過程與數(shù)據(jù)存儲過程類似,具體可見圖2所示的數(shù)據(jù)讀取流程圖。首先獲取需要讀取的數(shù)據(jù)的起始地址,從起始地址起掃描數(shù)據(jù),去除掉補零的冗余數(shù)據(jù),計算實際已用存儲空間;當(dāng)確認(rèn)報稅數(shù)據(jù)位于當(dāng)前存儲塊內(nèi)時,讀取標(biāo)志字段,針對實際數(shù)據(jù)采用逐段發(fā)送定長2k字節(jié)的方式訪問,即開票時按照單張變長(長度0-64k)發(fā)票存儲,報稅時按照固定長度(2k)讀取。
[0044]現(xiàn)有系統(tǒng)的報稅階段,仍采用定長方式接收報稅數(shù)據(jù)。報稅時重新讀取標(biāo)志信息,生成變長發(fā)票明細(xì)報稅數(shù)據(jù)。發(fā)票明細(xì)數(shù)據(jù)應(yīng)連續(xù)組織,重新編號(每2K數(shù)據(jù)分配一個編號),允許隨機讀取指定編號的報稅數(shù)據(jù)。報稅數(shù)據(jù)直接發(fā)送給接口函數(shù),不使用額外存儲空間。
[0045]還以圖2所述的存儲塊為例,塊中已存儲發(fā)票明細(xì)數(shù)據(jù)如下:0.5k字節(jié)、Ik字節(jié)、24.5k、60k、35k字節(jié)大小的發(fā)票。圖4給出了該實施例的數(shù)據(jù)讀取示意圖。
[0046]當(dāng)報稅時需要讀取編號為I的IK報稅數(shù)據(jù)時,應(yīng)取0.5k字節(jié)發(fā)票,加上Ik字節(jié)發(fā)票,加上24.5k字節(jié)發(fā)票的前0.5k,組合成2k的報稅數(shù)據(jù)。
[0047]當(dāng)報稅時需要讀取編號為2的IK報稅數(shù)據(jù)時,應(yīng)取24.5k字節(jié)發(fā)票緊挨著前0.5k的2k作為報稅數(shù)據(jù)。
[0048]當(dāng)報稅時需要讀取編號為61的2K報稅數(shù)據(jù)時,應(yīng)取35k字節(jié)發(fā)票的最后lk,跳過7k的舍棄空間,加上8k字節(jié)發(fā)票的前l(fā)k,組合成2k的報稅數(shù)據(jù)。
[0049]另外,本發(fā)明提出的方法用于擦除舊數(shù)據(jù)時,應(yīng)盡量保持有最多的剩余發(fā)票明細(xì)數(shù)據(jù)可用,如:發(fā)票明細(xì)數(shù)據(jù)均為指定長度時(512字節(jié)的偶數(shù)倍),可充分利用存儲空間;發(fā)票明細(xì)數(shù)據(jù)均為比較小的票時(小于或等于512字節(jié)),可充分利用存儲空間;發(fā)票明細(xì)數(shù)據(jù)大小隨機分布時,大數(shù)據(jù)量長期統(tǒng)計,平均每塊會浪費(發(fā)票最大允許長度/2)字節(jié)的空間。
[0050]以上說明對本發(fā)明而言只是說明性的,而非限制性的,本領(lǐng)域普通技術(shù)人員理解,在不脫離以下所附權(quán)利要求所限定的精神和范圍的情況下,可做出許多修改,變化,或等效,但都將落入本發(fā)明的保護范圍內(nèi)。
【權(quán)利要求】
1.一種變長數(shù)據(jù)存取方法,包括數(shù)據(jù)存儲階段和數(shù)據(jù)讀取階段兩部分,其特征在于,所述數(shù)據(jù)存儲階段包括以下步驟: Cl:將存儲介質(zhì)劃分為多個容量相等的存儲塊; C2:將所述變長數(shù)據(jù)按照字節(jié)數(shù)分割為多個含固定字節(jié)的數(shù)據(jù)段,對所述多個數(shù)據(jù)段進行封裝,得到多個包含固定字節(jié)的數(shù)據(jù)包;所述多個數(shù)據(jù)包根據(jù)剩余長度分為首包、中間包和尾包,其中剩余長度是指包括當(dāng)前數(shù)據(jù)包及其之后的所有數(shù)據(jù)包的大小; C3:計算所述存儲塊的剩余空間,根據(jù)剩余空間大小確定安放所述變長數(shù)據(jù)的存儲塊,以保證同一條變長數(shù)據(jù)存儲在同一個存儲塊內(nèi); C4:將所述多個數(shù)據(jù)包依次存入確定好的存儲塊內(nèi); 所述數(shù)據(jù)讀取階段包括以下步驟: Dl:獲取所述變長數(shù)據(jù)的起始地址和終止地址; D2:去除所述存儲塊塊尾的冗余數(shù)據(jù),計算實際已用存儲空間; D3:按照固定長度讀取所述存儲塊中的數(shù)據(jù); D4:讀取至終止地址,數(shù)據(jù)讀取過程結(jié)束。
2.根據(jù)權(quán)利要求1所述的一種變長數(shù)據(jù)存取方法,其特征在于,步驟C2中對所述數(shù)據(jù)包的格式為: 標(biāo)志位+數(shù)據(jù)總長度+剩余長度+數(shù)據(jù)段+校驗和 其中標(biāo)志位用于表示一個數(shù)據(jù)包的開始,數(shù)據(jù)總長度用于表示一條變長數(shù)據(jù)的總體長度,校驗和用于進行數(shù)據(jù)校驗。
3.根據(jù)權(quán)利要求1所述的一種變長數(shù)據(jù)存取方法,其特征在于,所述步驟C3中確定存儲塊的方法為,比較存儲塊的剩余空間和要存儲的變長數(shù)據(jù)的大小,若剩余空間大于所述變長數(shù)據(jù)大小,則將所述變長數(shù)據(jù)存儲在所述存儲塊內(nèi);若剩余空間不足以存儲該變長數(shù)據(jù)的,該剩余空間將被舍棄,所述變長數(shù)據(jù)從下一個存儲塊的首部開始存儲;同時記錄被舍棄的剩余空間數(shù)。
4.根據(jù)權(quán)利要求1所述的一種變長數(shù)據(jù)存取方法,其特征在于,所述步驟C4中還包括:判斷當(dāng)前數(shù)據(jù)包是否為首包,若是,重復(fù)步驟C3 ;若不是,直接存儲當(dāng)前數(shù)據(jù)包。
5.根據(jù)權(quán)利要求1所述的一種變長數(shù)據(jù)存取方法,其特征在于,當(dāng)步驟C2中分割后的數(shù)據(jù)段長度不足預(yù)設(shè)的固定字節(jié)的,不足部分用O填補。
6.根據(jù)權(quán)利要求1所述的一種變長數(shù)據(jù)存取方法,其特征在于,所述步驟D3中包括:讀取數(shù)據(jù)包中的標(biāo)志位,重新組裝原變長數(shù)據(jù)。
7.根據(jù)權(quán)利要求6所述的一種變長數(shù)據(jù)存取方法,其特征在于,采用順序讀取或隨機讀取的方式讀取數(shù)據(jù)。
【文檔編號】G06F3/06GK103902228SQ201210581148
【公開日】2014年7月2日 申請日期:2012年12月27日 優(yōu)先權(quán)日:2012年12月27日
【發(fā)明者】黃和石, 甘景全, 李利, 吳巖, 灑西濤, 宋穎, 李少維, 魏賀生, 張巍, 單國軍 申請人:航天信息股份有限公司