【问题标题】:C code truncating to 7 bits max valueC 代码截断为 7 位最大值
【发布时间】:2017-08-31 22:12:36
【问题描述】:

我有一些代码试图用于网络通信,以将信息从 c++ 提取到 MATLAB。我正在使用来自 Mathworks 开放交换的 pnet 程序(来自 c 的 mex 文件):https://www.mathworks.com/matlabcentral/fileexchange/345-tcp-udp-ip-toolbox-2-0-6?s_tid=answers_rc2-2_p5_MLT

在我的接收端,我期望接收 int8,然后我将其类型转换为 uint8。因此,对于每个接收到的字节,我期望 0-255 作为值。

我注意到我在接收端收到大量 127 的一些差异,并通过一些基本调试发现对于我从 128-255 发送的每个值,我的接收代码(在 pnet 接收调用之后立即)是显示 127。

因此,我认为 pnet.c 文件中可能存在错误,导致值被截断为 7 位最大值,而不是显示完整的 uint8 范围。

关于为什么会发生这种情况的任何想法?我主要是一个 matlab 用户,并没有花太多时间在数据类型转换上,所以我觉得这里有点超出我的深度。

接收返回错误/有趣错误字符的代码:

data = pnet('read',number of bytes to read,'noblock')

【问题讨论】:

  • 你怎么知道它不会发生在发送端?
  • 请向我们展示您使用该库的 MATLAB 代码。
  • 如果你将int8 -1“转换”成uint8,MATLAB 会像 C 那样做它并给你 255 还是会做一些奇怪的截断?
  • @4386427 我也可以访问传输端字节 - 所以我可以检查它们以了解我通过 UDP 套接字发送的内容
  • @AndreKampling 我目前在另一个盒子上,无法访问该代码段。我稍后会尝试转移它

标签: c matlab casting


【解决方案1】:

我知道这里发生了什么。事实证明,如果您使用 UDP 套接字(Java/MATLAB UDP 实现强制转换 int8)将大于 127 的值接收到 MATLAB 中,并且没有指定您希望接收的数据类型,MATLAB 将假定一些非描述性的错误字符。如果您进一步尝试对该错误字符进行类型转换,它将钳制为该类型可能的最高值。

在我的情况下,因为我正确地取回了一些数据,我没有意识到我没有正确指示 MATLAB 以 uint8 的形式接收。因此,它正确接收了 0-127,但给了我 128-255 的错误字符。然后我尝试将该错误字符类型转换为多种类型,并发现对于每个类型,它都显示为该特定类型的最大值。

修复只需要我在我的套接字接收调用中添加一个“uint8”选项。

固定代码:

data = pnet('read',number of bytes,'uint8','noblock')

【讨论】:

  • 很高兴您找到了解决方法。那我就删掉我的答案。
  • 在你的问题中添加代码(不工作)和在你的答案中(工作)将帮助其他可能有这个问题的人。还可以考虑 accepting this answer 向更广泛的社区展示问题已解决。
猜你喜欢
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多