【问题标题】:Byte array PAnsiChar in Delphi 2007Delphi 2007 中的字节数组 PAnsiChar
【发布时间】:2013-04-09 16:41:03
【问题描述】:

我有一个包含一些数据的字节数组...

CommandBytes : array of byte;

而且我有一个向蓝牙打印机发送命令的 VCL 功能。 VCL函数原型是这样的

SendData(PAnsiChar, Cardinal);

“此方法将字节从内存缓冲区传输到打开的设备”

如何正确传递字节数组以向打印机发送命令?

我是 Delphi 新手,我试过了:

SendData(PAnsiChar(@CommandBytes[0]), SizeOf(CommandBytes));

但它不起作用......

提前致谢。

【问题讨论】:

  • SendData 函数看起来设计得很奇怪。与 C 和 C++ 不同,Pascal 对 byte 和 char 有不同的类型。所以我通常期望PAnsiChar 是一个空终止指针。还有一个指向要声明为PByte 的字节数组的指针。 SendData 是由第三方定义的吗?在这种情况下,我想你必须适应它。但如果这是您的功能,那么我会将其更改为 PByte
  • 对不起,我不知道...我只是接受你的回答。

标签: delphi bytearray


【解决方案1】:

SizeOf() 在动态数组上产生指针的大小。动态数组是一种引用类型,表示为指向数组第一个元素的指针。因此SizeOf() 返回指针的大小。这对你没有用处。

您需要改用Length()

SendData(PAnsiChar(@CommandBytes[0]), Length(CommandBytes));

Length() 函数返回数组中元素的数量。

此外,我可能会简化您投射到PAnsiChar 的方式。你可以更简洁地这样做:

SendData(PAnsiChar(CommandBytes), Length(CommandBytes));

这很有意义,因为CommandBytes 是对动态数组的引用,它指向数组的第一个元素。

【讨论】:

    【解决方案2】:

    SizeOf(CommandBytes) 将返回指针的大小。

    使用Length(CommandBytes) 获取数组中的元素计数,在本例中为分配的缓冲区大小,因为 SizeOf(byte) = 1。

    【讨论】:

    • Length 返回元素计数而不是大小。如果恰好在这里是同一件事,因为 SizeOf(element) 是 1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2013-02-07
    • 1970-01-01
    • 2011-01-01
    • 2011-05-31
    相关资源
    最近更新 更多