字符串转换到结构时碰到汉字取得位数不对的问题(急)
结构定义如下:
Public Type Pack_Rsp
trxtype as string * 4 '交易代码
retcode as string * 6 '响应码
source as string * 2 '交易来源
brn_no as string * 6 '代号
ope_no as string * 6 '操作员号
name as string * 30 '客户姓名
count as string * 2 '本次返回条数
rtn_ind as string * 1 '标志
app_seq as string * 10 '编号
End Type
发送来的字符串如下
Str= "1001555555AA000001000002张三 20F0000000001 "
Winsock.getdata Str
MoveMemory ByVal VarPtr(Pack_Rsp), ByVal StrPtr(Str), bytesTotal
上面用MoveMemory时,取得的客户姓名为: "张三 20 "
会多取2位,把汉字当成1位来处理了?不知道如何解决,请各位一定要帮帮忙
[解决办法]
string strTmp = "abcdefg某某某 ";
int i= System.Text.Encoding.Default.GetBytes(strTmp).Length; //漢字黨兩位
int j= strTmp.Length; // 漢字黨1位
VB不太清楚
[解决办法]
vb中的汉字占一个字节
[解决办法]
直接用mid函数好了 干吗用api呢
[解决办法]
vb中的汉字占一个字节
-------------------------------
你丫真牛
[解决办法]
楼主的结构体定义的不合理,这是vb4时的定义方法,不建议采用
[解决办法]
真好玩...
Const mLng = "0123456789 "
Const mStr = "零一二三四五六七八九 "
Private Sub Form_Click()
Print Len(mLng), LenB(mLng)
Print Len(mStr), LenB(mStr)
Print Len(mLng & mStr), LenB(mStr & mLng)
End Sub
[解决办法]
VB处理字符串使用UNICODE,而UNICODE无论对于ASCII字符还是中文字符,其长度都是相等的,因此它们在VB里都被当作1个字符长度处理(不是1个字节)。
[解决办法]
简单的说就是 unicode不管中文还是英文都2个字节
[解决办法]
奇怪,name倒是对了,显示“张三”,可后面的count等都不对了
Private Declare Sub CopyMemory Lib "kernel32 " Alias "RtlMoveMemory " (Destination As Any, Source As Any, ByVal Length As Long)
Private Type Pack_Rsp
trxtype As String * 4 '交易代码
retcode As String * 6 '响应码
Source As String * 2 '交易来源
brn_no As String * 6 '代号
ope_no As String * 6 '操作员号
name As String * 30 '客户姓名
count As String * 2 '本次返回条数
rtn_ind As String * 1 '标志
app_seq As String * 10 '编号
End Type
Private Sub Command1_Click()
Dim s$, s1 As Pack_Rsp, L As Long
s = "1001555555AA000001000002张三 20F0000000001 "
L = Len(s1)
CopyMemory ByVal VarPtr(s1), ByVal StrPtr(s), L
Debug.Print s1.name
Debug.Print s1.count
Debug.Print s1.rtn_ind
Debug.Print s1.app_seq
[解决办法]
如果对方也是自己的程序,不如这样,字符串中用空格隔开,接收到后,再用split分解
[解决办法]
Private Sub Command1_Click()
Dim s$, s1 As Pack_Rsp, L As Long
s = "1001555555AA000001000002张三 20F0000000001 "
L = LenB(s1) '注意这里
CopyMemory ByVal VarPtr(s1), ByVal StrPtr(s), L
Debug.Print s1.name
Debug.Print s1.count
Debug.Print s1.rtn_ind
Debug.Print s1.app_seq
End Sub
[解决办法]
对了,用Lenb即可解决
[解决办法]
//To rainstormmaster(暴风雨 v2.0) ,应该怎样定义?
把字串定义成byte数组,但这样一来.处理起来就麻烦一些了,就你的问题而言,根本就不用定义结构体,用vb提供的mid函数就行了
[解决办法]
用mid怎么是一个一个取了?
比如 username=mid(str,25,30) 就可以了取到姓名了
或者你一定要用CopyMemory和MoveMemory 那先把str 转换 如下:
str = StrConv(str, vbFromUnicode)
MoveMemory ByVal VarPtr(Pack_Rsp), ByVal StrPtr(Str), bytesTotal
bytestotal=strconv(bytestotal,vbunicode)