- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Haskell 生成和解析现有的二进制格式(Xilinx FPGA 位文件)。目前我的数据结构和操作如下所示:
getCode = fromIntegral.fromEnum
getName = toEnum.fromIntegral
-- 1 1 1 1 1 1
-- 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
-- MOD_REG -------------------------------
-- 0 0 0 0 0 0 0 0 0 N B B B 1 1 1
-- M M M M
-- 2 1 0
data NewMode = NoNewMode | NewMode deriving (Show, Eq, Enum)
data Bootmode = SerialM | SpiM | BpiUp | InternalM | ReservedMode
| Jtag | ParallelS | SerialS
deriving (Show, Eq, Enum)
modeCode :: NewMode -> Bootmode -> Word16
modeCode newmode bootmode = (shiftL (getCode newmode) 6) .|.
(shiftL (getCode bootmode) 3) .|. 0x7
codeMode :: Word16 -> (NewMode, Bootmode)
codeMode w = (getName $ shiftR w 6 .&. 0x0001,
getName $ shiftR w 3 .&. 0x0007)
class Bitfield t where
representation :: something
toBits :: t -> Int
fromBits :: Int -> t
toBits = something (using representation)
fromBits = something (using representation)
instance Bitfield ModReg where
representation = something
-- 1 1 1 1 1 1
-- 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
-- CTL_REG -------------------------------
-- 0 0 0 0 0 0 0 0 E 0 S S P I 0 G
-- M B B E C T
-- 1 0 R P S
data EnMboot = DisMboot | EnMboot deriving (Show, Eq, Enum)
data Sbits = ReadWrite | IcapOnly | CrcOnly deriving (Show, Eq, Enum)
data Persist = NoPersist | Persist deriving (Show, Eq, Enum)
data Icap = NoIcap | Icap deriving (Show, Eq, Enum)
data GtsUserB = IoHighZ | IoActive deriving (Show, Eq, Enum)
ctlCode :: EnMboot -> Sbits -> Persist -> Icap -> GtsUserB -> Word16
ctlCode enmboot sbits persist icap gtsuserb =
(shiftL (getCode enmboot) 7) .|.
(shiftL (getCode sbits) 4) .|.
(shiftL (getCode persist) 3) .|.
(shiftL (getCode icap) 2) .|.
(getCode gtsuserb)
codeCtl :: Word16 -> (EnMboot,Sbits,Persist,Icap,GtsUserB)
codeCtl w =
(getName $ shiftR w 7 .&. 0x0001,
getName $ shiftR w 4 .&. 0x0003,
getName $ shiftR w 3 .&. 0x0001,
getName $ shiftR w 2 .&. 0x0001,
getName $ w .&. 0x0001)
-- 1 1 1 1 1 1
-- 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
-- COR_REG1 -------------------------------
-- D 0 1 1 1 1 1 1 0 0 0 C D D S S
-- A R P D C C
-- C 1 0
data DriveAwake = OpenDrainAwake | DriveAwake deriving (Show, Eq, Enum)
data CrcBypass = CrcEnabled | CrcDisabled deriving (Show, Eq, Enum)
data DonePipe = NoDonePipe | DonePipe deriving (Show, Eq, Enum)
data DriveDone = OpenDrainDone | DriveDone deriving (Show, Eq, Enum)
data SsClkSrc = Cclk | UserClk | JtagClk deriving (Show, Eq, Enum)
cor1Code :: DriveAwake -> CrcBypass -> DonePipe -> DriveDone ->
SsClkSrc -> Word16
cor1Code driveawake crcbypass donepipe drivedone ssclksrc =
(shiftL (getCode driveawake) 15) .|.
0x2F00 .|.
(shiftL (getCode crcbypass) 4) .|.
(shiftL (getCode donepipe) 3) .|.
(shiftL (getCode drivedone) 2) .|.
(getCode ssclksrc)
codeCor1 :: Word16 -> (DriveAwake,CrcBypass,DonePipe,DriveDone,SsClkSrc)
codeCor1 w =
(getName $ shiftR w 15 .&. 0x0001,
getName $ shiftR w 4 .&. 0x0001,
getName $ shiftR w 3 .&. 0x0001,
getName $ shiftR w 2 .&. 0x0001,
getName $ w .&. 0x0003)
最佳答案
我们将创建自己的库,用于读取和写入 Bits
.它的结构很像二进制包或序列化泛型的示例代码。我们不会利用泛型,因为除了我们需要的类型之外还有太多额外的信息,以便了解如何读取和写入值。我们将通过 monadic 阅读器读取数据,我们将从 Free
免费获得该阅读器。单子(monad)。
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE DeriveFunctor #-}
import Data.Word
import Data.Bits
import Control.Monad.Free
import Control.Applicative
import Data.Monoid
GetF
是我们的基本仿函数。我们执行的唯一操作是
Get
ing(读取)一些位。这将为我们提供一些值(value),我们知道将同时拥有
Bits
和
Integral
实例,从中我们需要确定下一步要做什么。
data GetF next = Get Int (forall b. (Bits b, Integral b) => b -> next)
deriving (Functor)
type Get = Free GetF
Get
所需的所有实例免费。
0
并且最后写入的位总是位
0
.
Pure
结果我们退货了。当我们接到指示
Get
要读取的位,我们屏蔽该位数并运行该函数以找出下一步要做什么。然后我们运行结果
Get
有那么多位右移。
runGet :: (Bits b, Integral b) => b -> Get a -> a
runGet bits (Pure a) = a
runGet bits (Free (Get l f)) = runGet (shiftR bits l) $ f (bits .&. oneBits l)
oneBits
用
1
填充指定数量的最低有效位s。
oneBits :: Bits b => Int -> b
oneBits n | n <= 0 = zeroBits
oneBits n = let (q, r) = n `quotRem` 2
bq = oneBits q
in bit 0 .|. shiftL (bq .|. shiftL bq q) r
Bits
的任何类型的位数。和
Integeral
实例。
data Put = Put Int (forall b. (Bits b, Integral b) => b)
Put
,我们将在构建时屏蔽这些位,以确保没有在长度之外放置额外的位。
mkPut :: Int -> (forall b. (Bits b, Integral b) => b) -> Put
mkPut l bits = Put l (bits .&. oneBits l)
Put
是
Monoid
这样我们就可以一个接一个地写。
instance Monoid Put where
mempty = Put 0 0
Put l1 bits1 `mappend` Put l2 bits2 = Put (l1 + l2) (bits1 .|. shiftL bits2 l1)
Get
s 和
Put
s。您正在编码或解码的大部分数据是
Enum
s 的各种位长。
getEnum
将构建
Get
出发地
Integral
Bits
到
Enum
.它本质上是您的
getName
包括要获得多少位。
putEnum
将这些位与它们的长度一起包裹起来。
getEnum :: Enum e => Int -> Get e
getEnum l = Free (Get l (Pure . toEnum . fromIntegral))
putEnum :: Enum e => Int -> e -> Put
putEnum l x = mkPut l (fromIntegral . fromEnum $ x)
getSkip
跳过位而不对它们做任何事情。
putSkip
把相同数量的
0
位;
putSkip1
把相同数量的
1
位。
getSkip :: Int -> Get ()
getSkip l = Free (Get l (const (Pure ())))
putSkip :: Int -> Put
putSkip l = Put l 0
putSkip1 :: Int -> Put
putSkip1 l = Put l (oneBits l)
ModReg
,代表一个
MOD_REG
结构体。以较低有效位存储的引导模式是结构中的第一个字段。
data ModReg = ModReg {bootmode :: Bootmode, newMode :: NewMode} deriving (Show, Eq)
data Bootmode = SerialM | SpiM | BpiUp | InternalM | ReservedMode
| Jtag | ParallelS | SerialS
deriving (Show, Eq, Enum)
data NewMode = NoNewMode | NewMode deriving (Show, Eq, Enum)
Bits
,不是因为我们想使用类型类,而是因为我不需要为所有这些都想出一个名字。
class Encodeable a where
put :: a -> Put
get :: Get a
ModReg
首先构造最低有效位。
ModReg
的诀窍第二行中的构造函数是我将字段放在最低有效位第一顺序的原因。
instance Encodeable ModReg where
put mr = putSkip1 3 <> putEnum 3 (bootmode mr) <> putEnum 1 (newMode mr)
get = ModReg <$ getSkip 3 <*> getEnum 3 <*> getEnum 1
Bits
中的位会很好。 .我们将首先用最重要的位打印它们。
import Data.List (intercalate)
showBitsN :: Bits b => Int -> b -> String
showBitsN n b = "[" ++ intercalate " " (map (\x -> if testBit b x then "1" else "0") [n,n-1..0]) ++ "]"
showBits :: FiniteBits b => b -> String
showBits b = showBitsN (finiteBitSize b) b
ModReg
与
Jtag
旗
1 0 1
在第 3 位到第 5 位和
NewMode
中旗
1
在第 6 位。我们将其转换为
Word16
然后再转换回来。
main = do
let mr = ModReg Jtag NewMode
print mr
let x = runPut (put mr) :: Word16
putStrLn $ showBits x
let mr' = runGet x get :: ModReg
print mr'
ModReg {bootmode = Jtag, newMode = NewMode}
111
[0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1]
ModReg {bootmode = Jtag, newMode = NewMode}
ModReg
s 连续变成
Word32
我们会得到一个小惊喜。
main = do
let (mr1, mr2) = (ModReg Jtag NewMode, ModReg BpiUp NoNewMode)
let x = runPut (put mr1 <> put mr2) :: Word32
print x
putStrLn $ showBits x
let mr' = runGet x (get >>= \a -> get >>= \b -> return (a, b)) :: (ModReg, ModReg)
print mr'
Word16
s 彼此相邻,所有设置位都适合不到一半的空间。
3055
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 1 1 1 1]
(ModReg {bootmode = Jtag, newMode = NewMode},ModReg {bootmode = BpiUp, newMode = NoNewMode})
get
和
put
为
ModReg
这样,我们需要添加
skip
s 表示最高有效位。
instance Encodeable ModReg where
put mr = putSkip1 3 <> putEnum 3 (bootmode mr) <> putEnum 1 (newMode mr) <> putSkip 9
get = ModReg <$ getSkip 3 <*> getEnum 3 <*> getEnum 1 <* getSkip 9
ModReg
写入 16 位宽。
1507439
[0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1]
(ModReg {bootmode = Jtag, newMode = NewMode},ModReg {bootmode = BpiUp, newMode = NoNewMode})
关于Haskell 位域和位级协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28911723/
这是我的本地域名 http://10.10.1.101/uxsurvey/profile/dashboard 在 Controller 中,我为用户列表设置了一个操作 redirect(control
要处理 Canonical URL,最佳做法是执行 301 重定向还是更好地为 www 和非 www 域使用相同的 IP 地址? 例如: 想要的规范 URL/域是 http://example.com
1 内网基础 内网/局域网(Local Area Network,LAN),是指在某一区域内有多台计算机互联而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机
1 内网基础 内网/局域网(Local Area Network,LAN),是指在某一区域内有多台计算机互联而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机
我想创建一个 weblogic 集群,其中有两个托管服务器,每个服务器在物理上独立的远程计算机上运行 根据weblogic文档 All Managed Servers in a cluster mus
我正在运行 grails 3.1.4,但在创建允许我将多个域对象绑定(bind)到其他几个域对象的模式时遇到了问题。作为我正在尝试做的一个例子: 我有三个类(class)。书籍、作者和阅读列表。 作者
我试图使用@count函数来根据它获取数据,但是在没有崩溃报告的情况下它以某种方式崩溃了。 这是代码 class PSMedia: Object { @objc dynamic var id
有谁知道是否有办法只输入字母字符而不输入数字?我想过这样的事情 CREATE DOMAIN countryDomain AS VARCHAR(100) CHECK( VALUE ??? );
我的代码: const checkoutUrl = 'https://example.com/checkout/*' window.onload = startup() function st
一些不是我编写的应用程序,也不是用 PHP 编写的,它为域 www.example.com 创建了一个 cookie。 我正在尝试替换该 cookie。所以在 PHP 中我做到了: setcookie
什么是 oauth 域?是否有任何免费的 oauth 服务?我可以将它用于 StackApps registration 吗? ?我在谷歌上搜索了很多,但找不到答案。 最佳答案 这是redirect_
自从 In October 2009, the Internet Corporation for Assigned Names and Numbers (ICANN) approved the cre
我使用 apache 作为我的应用程序 Web 服务器的代理,并希望即时更改与 sessionid cookie 关联的域名。 该cookie有一个与之关联的.company.com域,我想使用apa
我只想托管一个子域到cloudflare。我不想将主域名的域名服务器更改为他们的域名服务器。真的有可能吗? 最佳答案 是的,这是可能的,但是需要通过CloudFlare合作伙伴进行设置,或者您需要采用
When using socket in the UNIX domain, it is advisable to use path name for the directory directory m
想象两个共享一个域类的 Grails 应用程序。也许是 Book 域类。 一个应用程序被标识为数据的所有者,一个应用程序必须访问域数据。类似于亚马逊和亚马逊网络服务。 我想拥有的应用程序将使用普通的域
我有一个包含字段“URL”的表单。第一部分需要用户在文本框中填写。第二部分是预定义的,显示在文本框的右侧。 例如,用户在文本框中输入“test”。第二部分预定义为“.example.com”。因此,总
如果我要关闭并取消分配 azure 中的域 Controller ,从而生成新的 vm Generationid,我需要采取哪些步骤来恢复它? 最佳答案 what steps do I need to
我想尝试使用 Azure 作为托管提供商(我有一个域)。我读过那篇文章https://learn.microsoft.com/en-us/azure/app-service-web/web-sites
所以.... 我想知道是否有人可以在这方面协助我? 基本上,我已经创建了一个自托管的Docker容器,用作构建代理(Azure DevOps) 现在,我已经开始测试代理,并且由于我们的放置文件夹位于W
我是一名优秀的程序员,十分优秀!