簡體   English   中英

記憶中是否有“lseek”?

[英]Is there an “lseek” to memmove?

我有一個n字節的緩沖區,但我只想從字節3讀取sizeof(某事物)字節,這意味着我不想從緩沖區讀取字節1和2。 例如...

對於某些緩沖區,字節1 ='a',字節2 ='b',字節3 = uint64_t變量。 我想做的就像是

1. set begin to byte 3
2. read in sizeof(uint64_t) bytes from buffer using memmove

首先,一點澄清。 C數組索引從0開始,而不是1,因此更准確地說字節0是'a'而字節1是'b' 第二,你的第三個字節,不能包含uint64_t變量,但索引2可能是uint64_t對象的開頭

不, memmove()沒有lseek等價物 - 因為,與文件操作不同,對memmove()的調用必須指定起始點。

在這種情況下,您也可以使用memcpy()而不是memmove() 它們之間的唯一區別是memmove()正確處理重疊緩沖區。 由於您的源和目標是不同的對象,因此這不是問題。 它不會顯着影響代碼的速度,但閱讀它的任何人都不會想知道為什么選擇使用memmove()

鑒於:

unsigned char buf[SOME_SIZE];
uint64_t target;

你可以這樣做:

memcpy(&target, buf+2, sizeof target);

請注意,我使用sizeof target而不是sizeof (uint64_t) 兩者都可以工作,但是使用sizeof target會使您的代碼更具彈性(在以后更改時不易受到錯誤的影響)。 如果您決定更改target類型,則無需記住在memcpy()調用中更改類型。

為什么不簡單地使用這個:

uint64_t num;
num = * ((uint64_t *) (buffer + 2))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM