簡體   English   中英

這行C代碼是什么意思?

[英]What does this line of C code mean?

我正在將一些C代碼轉換為Delphi。 有人可以向我解釋一下這條線是什么意思嗎?

nResult = ( (pBuffer[ 0 ] << 8) & 0xFF00 )
 | ( pBuffer[ 1 ] & 0x00FF );

以下是上下文的其余代碼:

USHORT UTIL_htons( USHORT hostshort )
{
 PUCHAR pBuffer;
 USHORT nResult;

 nResult = 0;
 pBuffer = (PUCHAR )&hostshort;

 nResult = ( (pBuffer[ 0 ] << 8) & 0xFF00 )
  | ( pBuffer[ 1 ] & 0x00FF );

 return( nResult );
}

USHORT UTIL_ntohs( USHORT netshort )
{
 return( UTIL_htons( netshort ) );
}
ULONG UTIL_htonl( ULONG hostlong )
{
 PUCHAR pBuffer;
 ULONG nResult;
 UCHAR c, *pResult;

 pBuffer = (PUCHAR )&hostlong;

 if( !pBuffer )
 {
  return( 0L );
 }

 pResult = (UCHAR * )&nResult;

 c = ((UCHAR * )pBuffer)[ 0 ];
 ((UCHAR * )pResult)[ 0 ] = ((UCHAR * )pBuffer)[ 3 ];
 ((UCHAR * )pResult)[ 3 ] = c;

 c = ((UCHAR * )pBuffer)[ 1 ];
 ((UCHAR * )pResult)[ 1 ] = ((UCHAR * )pBuffer)[ 2 ];
 ((UCHAR * )pResult)[ 2 ] = c;

 return( nResult );
}
ULONG UTIL_ntohl( ULONG netlong )
{
 return( UTIL_htonl( netlong ) );
}

在此先感謝Bojan

顯然(所有這些以大寫形式定義使其難以閱讀)函數交換占用2或4個字節的值的內部字節順序。 例如:

UTIL_htons(0x1234); /* returns 0x3412 */
UTIL_htonl(0x12345678); /* returns 0x78563412 */

我不知道如何在Delphi中編寫它們...

希望它們已經被編寫,Delphi使用的庫有一些名稱或其他名稱。 檢查您的文檔。


編輯

nResult = ( (pBuffer[ 0 ] << 8) & 0xFF00 ) | ( pBuffer[ 1 ] & 0x00FF );

在這一行

pBuffer[0]是數組pBuffer的第一個元素
pBuffer[0] << 8將該值向左移8位(0x12變為0x1200)
(...) & 0xFF00是冗余的:它重置最右邊的8位

pBuffer[1] & 0x00FF只保留最右邊的8位(因此0x1234變為0x0034)

其他操作| 是一個按位或

( ... & 0xFF00) | ( ... & 0xFF00) ( ... & 0xFF00) | ( ... & 0xFF00)是第一部分的最左邊8位,第二部分最右邊8位。


編輯:hto * / * toh命名

C中的函數htonlhtonsntohlntohs用於在主機和網絡字節順序之間轉換值。

字節順序不一定不同(網絡字節順序是big-endian),因此函數的第一部分應該在進行交換之前檢查主機字節順序是小端還是大端...或者檢查完成以前在使用您發布的功能的程序中。

你不必翻譯它們,只包括WinSock ,它有四個!

它似乎只是一個字節交換,你可以非常簡單地實現:

function Swap32(const Value: DWORD): DWORD; assembler;
asm
  bswap eax;
end;

function Swap16(const Value: WORD): WORD; assembler;
asm
  xchg al, ah;
end;

相當模糊的逐位表達

nResult = ( (pBuffer[ 0 ] << 8) & 0xFF00 )
 | ( pBuffer[ 1 ] & 0x00FF );

暗示:

var 
  pBuffer: PByteArray; 
  nResult: Word;

所以,Pascal的結構清晰度看起來像:

WordRec(nResult).Hi := pBuffer^[0];
WordRec(nResult).Lo := pBuffer^[1];

甚至隱式byteswap在這里也很明顯

暫無
暫無

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

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