这行C代码是什么意思?

时间:2010-11-13 21:00:09

标签: c++ c delphi

我正在将一些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 ) );
}

提前致谢 博

4 个答案:

答案 0 :(得分:4)

显然(所有这些以大写形式定义使其难以阅读)函数正在交换占用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)是第一部分最左边的8位,第二部分最右边的8位。


编辑:hto * / * toh命名

C中的函数htonlhtonsntohlntohs用于在主机和网络字节顺序之间转换值。

字节顺序不一定不同(网络字节顺序是big-endian),所以函数的第一部分应该在进行交换之前检查主机字节顺序是小端还是大端...或者先前在使用您发布的功能的程序中完成了检查。

答案 1 :(得分:3)

您不必翻译它们,只需包含WinSock,它包含所有四个!

答案 2 :(得分:2)

它似乎只是一个字节交换,你可以非常简单地实现:

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

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

答案 3 :(得分:0)

相当模糊的按位表达式

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在这里非常明显