ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 14770|回复: 19

[已解决] 十进制转换为二进制

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-7-8 19:22 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:数据格式转换
本帖最后由 清泉石上流shm 于 2012-7-14 21:18 编辑

各位大侠们,版主们:
      急救啊!!!
请看下面的代码:
    Open ThisWorkbook.Path & "\YSLX.dat" For Binary As #1
    Get #1, 1, YSLX
    Close #1
    F = Application.dec2bin(YSLX, 8)      单元格可以用DEC2BIN(A1,8)的,在程序中怎么用呢?这里想将得到的YSLX值变成二进制文本字符串!!!

TA的精华主题

TA的得分主题

发表于 2012-7-8 19:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

TA的精华主题

TA的得分主题

发表于 2012-7-8 20:21 | 显示全部楼层
本帖最后由 香川群子 于 2012-7-8 20:33 编辑

这么简单的事……自己写一段自定义函数代码就解决了。

  1. Function myBin(N, Optional l = 8)
  2.     If N > 2 ^ l - 1 Then l = Int(Log(N) / Log(2)) + 1 '超过指定数位时,计算返回合适的数位。   
  3.     Do
  4.         s = N Mod 2 & s '从个位起,计算除以2的余数0或1,作为二进制结果返回
  5.         N = N \ 2 '迭代计算除以2的整数部分
  6.     Loop While N '整数>0时继续(直到=0时停止)
  7.     myBin = Right(String(l, "0") & s, l) '按指定数位输出结果,默认输出8位 (超过指定数位时自动返回合适数位)
  8. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-7-8 20:39 | 显示全部楼层
任意进制转换的自定义函数:

x为转换对象数值,n为将要转化的进制,p为转换前进制(默认10进制),d为转换输出数位
  1. Function dec2base(x, n, Optional p = 10, Optional d = 0)
  2.     If p = 0 Then p = 10
  3.     If p = 10 And (x >= 2 ^ 31 Or x <= -2 ^ 31) Then Exit Function
  4.     If n < 2 Or n > 36 Or p < 2 Or p > 36 Then Exit Function
  5.    
  6.     If x < 0 Then x = x + 2 ^ 31: k = -1
  7.     If p < 10 Then
  8.         For i = Len(x) To 1 Step -1
  9.             y = y + Mid(x, i, 1) * p ^ (Len(x) - i)
  10.         Next
  11.     ElseIf p = 10 Then
  12.         y = x
  13.     ElseIf p > 10 Then
  14.         For i = Len(x) To 1 Step -1
  15.             y = y + IIf(IsNumeric(Mid(x, i, 1)), Mid(x, i, 1), Asc(Mid(x, i, 1)) - 55) * p ^ (Len(x) - i)
  16.         Next
  17.     End If

  18.     If k = -1 Then
  19.         For i = 1 To d
  20.             dec2base = IIf(y Mod n < 10, y Mod n, Chr(y Mod n + 55)) & dec2base
  21.             y = Int(y / n)
  22.         Next
  23.     Else
  24.         Do Until y = 0
  25.             dec2base = IIf(y Mod n < 10, y Mod n, Chr(y Mod n + 55)) & dec2base
  26.             y = Int(y / n)
  27.         Loop
  28.         If Len(dec2base) < d Then dec2base = Right(String(d, "0") & dec2base, d)
  29.     End If
  30.    
  31. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-7-8 20:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 香川群子 于 2012-7-8 21:21 编辑

也可以直接用len(结果)来判断是否输出结果要添加0
  1. Function myBin(n, Optional l = 8)
  2. '    If n > 2 ^ l - 1 Then l = Int(Log(n) / Log(2)) + 1
  3.     Do
  4.         myBin = n Mod 2 & myBin
  5.         n = n \ 2
  6.     Loop While n
  7.     If Len(myBin) < l Then myBin = Right(String(l, "0") & myBin, l)
  8. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-9 19:59 | 显示全部楼层
本帖最后由 清泉石上流shm 于 2012-7-9 20:03 编辑
香川群子 发表于 2012-7-8 20:57
也可以直接用len(结果)来判断是否输出结果要添加0


老师:帮我看看这个吧,没有人会,昨天看了你的上面的代码想自己利用你上面的代码写一个的,后来发现写了很多代码,这样对读取和写入的速度影响会比较大(本来的想法是根据读取或写入的位进行运算得到所在BYTE的位置然后处理这个byte),请帮我看看吧!
http://club.excelhome.net/thread-890641-1-1.html     谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-9 21:02 | 显示全部楼层
本帖最后由 清泉石上流shm 于 2012-7-9 21:03 编辑
清泉石上流shm 发表于 2012-7-9 19:59
老师:帮我看看这个吧,没有人会,昨天看了你的上面的代码想自己利用你上面的代码写一个的,后来发现写 ...


下面的是我做的读取文件某一位的程序,但是写入就没有做出来
Function dubinwei(A As Long)
Dim Y As Byte
Dim F As String
Dim B As Long
Dim C As Integer
Dim Z As String
B = Int(A / 8)
C = A - B * 8
If C > 0 Then
    Open ThisWorkbook.Path & "\Y.dat" For Binary As #1
    Get #1, B + 1, Y
    Close #1
    Z = myBin(Y)
    F = Mid(Z, C, 1)
Else
    Open ThisWorkbook.Path & "\Y.dat" For Binary As #1
    Get #1, B, Y
    Close #1
    Z = myBin(Y)
    F = Mid(Z, 8, 1)
End If
End Function
Function myBin(N, Optional l = 8) As String
Dim s As String
    Do
        s = N Mod 2 & s
        N = N \ 2
    Loop While N
    myBin = Right(String(l, "0") & s, l)
End Function
呵呵,下面的是你的程序,嘿嘿!
请老师帮忙看看,上面代码以更快么?写入某一位可以帮忙写下么?

TA的精华主题

TA的得分主题

发表于 2012-7-9 21:07 | 显示全部楼层
你直接说你想干什么,然后上附件啊。

你自己写的代码,肯定有值得改进的地方吧。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-9 22:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2012-7-9 21:07
你直接说你想干什么,然后上附件啊。

你自己写的代码,肯定有值得改进的地方吧。

原题目是这个:
       通常我们写入和读取二进制是按照byte或其他的数据类型读取的,但是我想直接读取和写入某一个数据位这样该如何写代码??
例如:我在文件的第513位写入0或者1  ,读出文件的第45613位的数据(0或者1)这样该如何写代码??(数据位任意给定)
下面的是我做的读取文件某一位的程序,但是写入就没有做出来
Function dubinwei(A As Long)
Dim Y As Byte
Dim F As String
Dim B As Long
Dim C As Integer
Dim Z As String
B = Int(A / 8)
C = A - B * 8
If C > 0 Then
    Open ThisWorkbook.Path & "\Y.dat" For Binary As #1
    Get #1, B + 1, Y
    Close #1
    Z = myBin(Y)
    F = Mid(Z, C, 1)
Else
    Open ThisWorkbook.Path & "\Y.dat" For Binary As #1
    Get #1, B, Y
    Close #1
    Z = myBin(Y)
    F = Mid(Z, 8, 1)
End If
End Function
Function myBin(N, Optional l = 8) As String
Dim s As String
    Do
        s = N Mod 2 & s
        N = N \ 2
    Loop While N
    myBin = Right(String(l, "0") & s, l)
End Function

TA的精华主题

TA的得分主题

发表于 2012-7-10 05:54 | 显示全部楼层
写入只能按照字节,一个字节一个字节地改。 不能按照 0 / 1 这样数位来改。

计算机不是按照1个数位单位来储存数据的。最低单位是一个字节。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-21 23:51 , Processed in 0.044222 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表