首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >固定字节长度位串的长生不老型- Dialyzer不高兴

固定字节长度位串的长生不老型- Dialyzer不高兴
EN

Stack Overflow用户
提问于 2018-06-06 20:35:32
回答 1查看 424关注 0票数 0

我正在尝试创建一个代表固定长度的二进制包的类型语言。因此,使用固定N字节的位串(例如25字节)似乎是正确的想法。

Elixir声明如下:

代码语言:javascript
运行
复制
                                ## Bitstrings
| <<>>                          # empty bitstring
| <<_::size>>                   # size is 0 or a positive integer
| <<_::_*unit>>                 # unit is an integer from 1 to 256
| <<_::size, _::_*unit>>

由此,我假设您可以使用@spec my_type ::<_::25,_::_*8>>

代码语言:javascript
运行
复制
@type my_type :: <<_::25, _::_*8>>

@spec my_type_test() :: my_type
def my_type_test() do
    # 25 byte bitstring with start-of-frame byte
    << 0xA5::size(8) , 0::size(24)-unit(8) >>
end

但是Dialyzer带着下面的话回来了:

代码语言:javascript
运行
复制
[ElixirLS Dialyzer] Invalid type specification for function 
'TestModule':my_type_test/0. The success typing 
is () -> <<_:200>>

哈?但是它们都是位字符串,位长是一样的!

有人知道为什么Dialyzer不喜欢这个吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-06 20:49:34

::后面的数字指定位数,而不是字节数。如果希望类型匹配25字节加上N*8字节,类型需要如下:

代码语言:javascript
运行
复制
@type my_type :: <<_::200, _::_*64>>

在进行此更改后,您的原始表达式将通过Dialyzer的检查,并按预期将大小增加1位或1字节失败。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50729162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档