校验时溢出

tansx 2018-08-05 04:20:53
Private Function GetXOR(printData() As Byte, p As Integer) As Byte ' 校验
ReDim sHex(p) As Byte
Dim Sum As Long: Sum = 0

On Error Resume Next
For I = 0 To p - 1
   sHex(I) = Val(printData(I))
Next
For I = 0 To UBound(sHex) - 1
   Sum = Sum + sHex(I)
If Sum > 255 Then
 Sum = Sum And 255
End If
Next
GetXOR = 256 - Sum

End Function
以上代码当sum=0时提示溢出,请教怎么修改代码才不会出错?
...全文
404 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
脆皮大雪糕 2018-08-13
  • 打赏
  • 举报
回复
引用 14 楼 Chen8013 的回复:
[quote=引用 13 楼 chewinggum 的回复:]
其实 个人理解,这个函数的逻辑是

GetXOR = 255-(所有数据和 mod 256)

楼主写的是: GetXOR = 256 - Sum
 这跟你的“理解”不一致吧!
按楼主的写法(Sum → 返回值):
1 → 255
2 → 254
3 → 253
…………
254 → 2
255 → 1
 出现“异常”是因为sum为0时,返回值为“256”去了。

而你写的表达式:
1 → 254
2 → 253
3 → 252
…………
254 → 1
255 → 0
 当Sum为0时,返回值是255。
[/quote]

所以我认为 sum=0 对应255 能和 1对应254 形成输入和输出的连续。
否则 sum=0 ->0 这个0就显得很突兀,形成函数上的“奇点”
当然,个人认为,最后到底应该是啥看楼主自己的判断。说不定他们的设计就是0就是这么奇怪。如果设计如此,反正我心中会骂设计者,但还会按照设计去实现就是了。
舉杯邀明月 2018-08-08
  • 打赏
  • 举报
回复
引用 13 楼 chewinggum 的回复:
其实 个人理解,这个函数的逻辑是

GetXOR = 255-(所有数据和 mod 256)

楼主写的是: GetXOR = 256 - Sum
 这跟你的“理解”不一致吧!
按楼主的写法(Sum → 返回值):
1 → 255
2 → 254
3 → 253
…………
254 → 2
255 → 1
 出现“异常”是因为sum为0时,返回值为“256”去了。

而你写的表达式:
1 → 254
2 → 253
3 → 252
…………
254 → 1
255 → 0
 当Sum为0时,返回值是255。
脆皮大雪糕 2018-08-08
  • 打赏
  • 举报
回复
其实 个人理解,这个函数的逻辑是

GetXOR = 255-(所有数据和 mod 256)
舉杯邀明月 2018-08-07
  • 打赏
  • 举报
回复
引用 11 楼 chewinggum 的回复:
[quote=引用 10 楼 Chen8013 的回复:]
[quote=引用 9 楼 chewinggum 的回复:]
[quote=引用 6 楼 Chen8013 的回复:]
[quote=引用 5 楼 chewinggum 的回复:]
最后一句改成
GetXOR = 255 - Sum

因为你的GetXOR是byte 取值 0~255 而你的sum取值也是0~255 你用 256-sum得到的数值范围是1~256所以当sum=0的时候溢出。确认一下你的逻辑,最后得到的是 0~255还是1~256

你这样不对吧。 
比如原来 Sum为1时,返回255,而你改后,会返回254。跟最初不符的。
[/quote]

所以我叫他确认一下,原来的逻辑到底对不对
他原来的逻辑里面,很容易sum=0的
如果sum=0是合理的,那么GetXOR = 256 - Sum 就是不合理的。[/quote]

我在1楼就说过了,改成 GetXOR =255 And ( 256 - Sum) 就行了啊。
当Sum 为0时, 255 And ( 256 - Sum) 也是0啊。
[/quote]
所以,sum=0的时候,结果到底是 0 还是255, sum = 1 的时候结果是255还是254 要看楼主的具体业务逻辑了。
在我看来这是个checksum之类的函数,这类函数求出来的东西必然会有另外一段同逻辑的代码把相同的数据算一遍得到相同的结果才行。所以函数的逻辑必须是严格的,而不是说让它不报错的有结果就行了。[/quote]
应该 Sum = 1时,结果为255…… 要不然,他就不应该是“结果”= 256 - sum 了。
 只是他“没想到”的是,因为数据类型值域的关系,sum为0时,出现溢出了。

不过,反正我们都是在猜。
脆皮大雪糕 2018-08-07
  • 打赏
  • 举报
回复
引用 10 楼 Chen8013 的回复:
[quote=引用 9 楼 chewinggum 的回复:]
[quote=引用 6 楼 Chen8013 的回复:]
[quote=引用 5 楼 chewinggum 的回复:]
最后一句改成
GetXOR = 255 - Sum

因为你的GetXOR是byte 取值 0~255 而你的sum取值也是0~255 你用 256-sum得到的数值范围是1~256所以当sum=0的时候溢出。确认一下你的逻辑,最后得到的是 0~255还是1~256

你这样不对吧。 
比如原来 Sum为1时,返回255,而你改后,会返回254。跟最初不符的。
[/quote]

所以我叫他确认一下,原来的逻辑到底对不对
他原来的逻辑里面,很容易sum=0的
如果sum=0是合理的,那么GetXOR = 256 - Sum 就是不合理的。[/quote]

我在1楼就说过了,改成 GetXOR =255 And ( 256 - Sum) 就行了啊。
当Sum 为0时, 255 And ( 256 - Sum) 也是0啊。
[/quote]
所以,sum=0的时候,结果到底是 0 还是255, sum = 1 的时候结果是255还是254 要看楼主的具体业务逻辑了。
在我看来这是个checksum之类的函数,这类函数求出来的东西必然会有另外一段同逻辑的代码把相同的数据算一遍得到相同的结果才行。所以函数的逻辑必须是严格的,而不是说让它不报错的有结果就行了。
舉杯邀明月 2018-08-06
  • 打赏
  • 举报
回复
引用 5 楼 chewinggum 的回复:
最后一句改成
GetXOR = 255 - Sum

因为你的GetXOR是byte 取值 0~255 而你的sum取值也是0~255 你用 256-sum得到的数值范围是1~256所以当sum=0的时候溢出。确认一下你的逻辑,最后得到的是 0~255还是1~256

你这样不对吧。 
比如原来 Sum为1时,返回255,而你改后,会返回254。跟最初不符的。
脆皮大雪糕 2018-08-06
  • 打赏
  • 举报
回复
最后一句改成
GetXOR = 255 - Sum

因为你的GetXOR是byte 取值 0~255 而你的sum取值也是0~255 你用 256-sum得到的数值范围是1~256所以当sum=0的时候溢出。确认一下你的逻辑,最后得到的是 0~255还是1~256
of123 2018-08-06
  • 打赏
  • 举报
回复
错了。

Next
Sum = 256 - Sum
GetXOR = Sum And 255
of123 2018-08-06
  • 打赏
  • 举报
回复
Next
Sum = 256 - Sum
GetXOR = Sum
舉杯邀明月 2018-08-06
  • 打赏
  • 举报
回复
引用 9 楼 chewinggum 的回复:
[quote=引用 6 楼 Chen8013 的回复:]
[quote=引用 5 楼 chewinggum 的回复:]
最后一句改成
GetXOR = 255 - Sum

因为你的GetXOR是byte 取值 0~255 而你的sum取值也是0~255 你用 256-sum得到的数值范围是1~256所以当sum=0的时候溢出。确认一下你的逻辑,最后得到的是 0~255还是1~256

你这样不对吧。 
比如原来 Sum为1时,返回255,而你改后,会返回254。跟最初不符的。
[/quote]

所以我叫他确认一下,原来的逻辑到底对不对
他原来的逻辑里面,很容易sum=0的
如果sum=0是合理的,那么GetXOR = 256 - Sum 就是不合理的。[/quote]

我在1楼就说过了,改成 GetXOR =255 And ( 256 - Sum) 就行了啊。
当Sum 为0时, 255 And ( 256 - Sum) 也是0啊。
脆皮大雪糕 2018-08-06
  • 打赏
  • 举报
回复
引用 6 楼 Chen8013 的回复:
[quote=引用 5 楼 chewinggum 的回复:]
最后一句改成
GetXOR = 255 - Sum

因为你的GetXOR是byte 取值 0~255 而你的sum取值也是0~255 你用 256-sum得到的数值范围是1~256所以当sum=0的时候溢出。确认一下你的逻辑,最后得到的是 0~255还是1~256

你这样不对吧。 
比如原来 Sum为1时,返回255,而你改后,会返回254。跟最初不符的。
[/quote]

所以我叫他确认一下,原来的逻辑到底对不对
他原来的逻辑里面,很容易sum=0的
如果sum=0是合理的,那么GetXOR = 256 - Sum 就是不合理的。
tansx 2018-08-06
  • 打赏
  • 举报
回复
引用 3 楼 of123 的回复:
错了。

Next
Sum = 256 - Sum
GetXOR = Sum And 255


谢谢!我测试看看。
谢谢!
tansx 2018-08-06
  • 打赏
  • 举报
回复
引用 1 楼 Chen8013 的回复:
Byte数据类型的值域是 [0, 255], 你的Sum为0时, 256-Sum 值是256,当然就溢出了啊。

你改成 GetXOR =255 And ( 256 - Sum) 应该可以吧?

还有,你的第1个For循环,纯粹多余吧!
并且还“浪费资源”,做一些无用的数据类型转换。
(当然不知道编译器是否有那么聪明,能把它“优化掉”了)。

另外,第2个For循环中的If语句,也是没必要的,从现在的硬件架构来说,代码比较“低效”,
把 Sum = Sum + sHex(I) 改成: Sum =255 And ( Sum + sHex(I) )
那个If语句块就不需要了,代码精减、并且实际运行效率比你用If语句块高一些。



非常感谢您的指教!我试试看看。
舉杯邀明月 2018-08-05
  • 打赏
  • 举报
回复
Byte数据类型的值域是 [0, 255], 你的Sum为0时, 256-Sum 值是256,当然就溢出了啊。

你改成 GetXOR =255 And ( 256 - Sum) 应该可以吧?

还有,你的第1个For循环,纯粹多余吧!
并且还“浪费资源”,做一些无用的数据类型转换。
(当然不知道编译器是否有那么聪明,能把它“优化掉”了)。

另外,第2个For循环中的If语句,也是没必要的,从现在的硬件架构来说,代码比较“低效”,
把 Sum = Sum + sHex(I) 改成: Sum =255 And ( Sum + sHex(I) )
那个If语句块就不需要了,代码精减、并且实际运行效率比你用If语句块高一些。

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧