[英]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.