字符串补位问题

wctmac123 2012-06-08 11:29:48
比如我有个字符串 string a="abcd5de",刚好是奇数 但是我现在需要的一个方法里 这个字符串必须是偶数
if ((a.Length % 2) != 0) a+= " "; 我是这么想的 但是 貌似 计算的时候 还是当成奇数

我的整个方法 如下

public byte[] strToHexByte(string hexString)
{
hexString = "abcd5de";
if ((hexString.Length % 2) != 0)
hexString += " ";
byte[] returnBytes = new byte[hexString.Length / 2];
for (int i = 0; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2),16);
return returnBytes;
}
...全文
454 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ParanoidKing 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 7 楼 的回复:
引用 5 楼 的回复:
引用 3 楼 的回复:
不应该是在末尾不空格,而是在最后一位之前补0

如果最后一位之前补零 那么我获取到的十六进制数据就会不是原先我要的了


你要的结果不是returnBytes={0xab, 0xcd, 0x5d, 0x0e}吗?

这方面我也不是很懂 我是看人家写的拿来用,我看他 的结果都是 数字组成的
[/Quote]

好吧,我说的是{171,205,93,14}
wctmac123 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 5 楼 的回复:
引用 3 楼 的回复:
不应该是在末尾不空格,而是在最后一位之前补0

如果最后一位之前补零 那么我获取到的十六进制数据就会不是原先我要的了


你要的结果不是returnBytes={0xab, 0xcd, 0x5d, 0x0e}吗?
[/Quote]
这方面我也不是很懂 我是看人家写的拿来用,我看他 的结果都是 数字组成的
ParanoidKing 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 3 楼 的回复:
不应该是在末尾不空格,而是在最后一位之前补0

如果最后一位之前补零 那么我获取到的十六进制数据就会不是原先我要的了
[/Quote]

你要的结果不是returnBytes={0xab, 0xcd, 0x5d, 0x0e}吗?
E次奥 2012-06-08
  • 打赏
  • 举报
回复
给第一位补0!
wctmac123 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
不应该是在末尾不空格,而是在最后一位之前补0
[/Quote]
如果最后一位之前补零 那么我获取到的十六进制数据就会不是原先我要的了
wctmac123 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
不是长度的问题,是空格在ToByte的时候有问题
[/Quote]
那应该如何处理呢?
ParanoidKing 2012-06-08
  • 打赏
  • 举报
回复
不应该是在末尾不空格,而是在最后一位之前补0
cnfixit 2012-06-08
  • 打赏
  • 举报
回复
不是长度的问题,是空格在ToByte的时候有问题
  • 打赏
  • 举报
回复
已经是偶数

if ((hexString.Length % 2) != 0)
hexString += " ";
int count = hexString.Length;//8
wctmac123 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]
以多少位数字显示。比如string.Format("{0:X2}",14)="0e",string.Format("{0:X4}",14)="000e",
[/Quote]
实在是感谢 分不多,请见谅
ParanoidKing 2012-06-08
  • 打赏
  • 举报
回复
以多少位数字显示。比如string.Format("{0:X2}",14)="0e",string.Format("{0:X4}",14)="000e",
wctmac123 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
引用 16 楼 的回复:
引用 15 楼 的回复:
引用 14 楼 的回复:
引用 11 楼 的回复:
是string.Format吧?传进strToHexByte方法之后都会是一个确定的字符串,不可能有占位符的了,你试试补0吧,应该没问题的。
或者你就什么都不补了,最后一位没有的话就只取一位吧,这样

C# code


public static byte[] strToH……
[/Quote]
万分感谢,最后一个问题string.Format("{0:X4}{1}{2}", 7 + getLength(content), comm, hexContent);

string.Format("{0:X4}{1}{2}", 7 + getLength(content), comm, hexContent);

这里的 x4,x2什么意思呢?x是十六机制吧 2,和4什么意思
ParanoidKing 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]
引用 15 楼 的回复:
引用 14 楼 的回复:
引用 11 楼 的回复:
是string.Format吧?传进strToHexByte方法之后都会是一个确定的字符串,不可能有占位符的了,你试试补0吧,应该没问题的。
或者你就什么都不补了,最后一位没有的话就只取一位吧,这样

C# code


public static byte[] strToHexByte(string ……
[/Quote]

是的。a~f只是一个记号,10个阿拉伯数字不够用了就用字母代替而起。
wctmac123 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
引用 14 楼 的回复:
引用 11 楼 的回复:
是string.Format吧?传进strToHexByte方法之后都会是一个确定的字符串,不可能有占位符的了,你试试补0吧,应该没问题的。
或者你就什么都不补了,最后一位没有的话就只取一位吧,这样

C# code


public static byte[] strToHexByte(string hexString)
{
……
[/Quote]
哦 十进制是一样的 那么十六进制的话 我不考虑我的crc验证 如果是单纯的 就一个字符串 那么  12,34,56,0d,这个0d和d也一样吗 
ParanoidKing 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
引用 11 楼 的回复:
是string.Format吧?传进strToHexByte方法之后都会是一个确定的字符串,不可能有占位符的了,你试试补0吧,应该没问题的。
或者你就什么都不补了,最后一位没有的话就只取一位吧,这样

C# code


public static byte[] strToHexByte(string hexString)
{
hexString = "……
[/Quote]

呃,那个你就写hexString = "abcd5de"吧。
看你的代码,是把abcd5de按两位两位转成byte数组,只不过是16进制的写法而已。如果是10进制的,比如1234567,你分离出来12、34、56之后,7和07是一样的。我想表达的只是这个意思。
wctmac123 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
是string.Format吧?传进strToHexByte方法之后都会是一个确定的字符串,不可能有占位符的了,你试试补0吧,应该没问题的。
或者你就什么都不补了,最后一位没有的话就只取一位吧,这样

C# code


public static byte[] strToHexByte(string hexString)
{
hexString = "abcd5d0e";……
[/Quote]
谢谢哥们耐心回答,我有个问题就是 比如我这个 abcd5de 刚好de是crc16的验校码,那么变成了d0e是不是和原先的意思不同了?
__天涯寻梦 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 7 楼 的回复:
引用 5 楼 的回复:
引用 3 楼 的回复:
不应该是在末尾不空格,而是在最后一位之前补0

如果最后一位之前补零 那么我获取到的十六进制数据就会不是原先我要的了


你要的结果不是returnBytes={0xab, 0xcd, 0x5d, 0x0e}吗?

这方面我也不是很懂 我是看人家写的拿来用,我看他 的结果都是 数字组成的
[/Quote]
如果条件许可,你把同一个字符串在人家写的那里执行下看结果是多少,贴上来,大家都知道怎么帮你处理了
cnfixit 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

是string.Format吧?传进strToHexByte方法之后都会是一个确定的字符串,不可能有占位符的了,你试试补0吧,应该没问题的。
或者你就什么都不补了,最后一位没有的话就只取一位吧,这样
C# code

public static byte[] strToHexByte(string hexString)
{
hexString = "abcd5d0e";
b……
[/Quote]

楼上的办法是最对症的
ParanoidKing 2012-06-08
  • 打赏
  • 举报
回复
是string.Format吧?传进strToHexByte方法之后都会是一个确定的字符串,不可能有占位符的了,你试试补0吧,应该没问题的。
或者你就什么都不补了,最后一位没有的话就只取一位吧,这样

public static byte[] strToHexByte(string hexString)
{
hexString = "abcd5d0e";
byte[] returnBytes = new byte[(int)Math.Ceiling(hexString.Length / 2.0)];
for (int i = 0; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, (i * 2 == hexString.Length - 1) ? 1 : 2), 16);
return returnBytes;
}

但我觉得补0是最好的
wctmac123 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 8 楼 的回复:
引用 7 楼 的回复:
引用 5 楼 的回复:
引用 3 楼 的回复:
不应该是在末尾不空格,而是在最后一位之前补0

如果最后一位之前补零 那么我获取到的十六进制数据就会不是原先我要的了


你要的结果不是returnBytes={0xab, 0xcd, 0x5d, 0x0e}吗?

这方面我也不是很懂 我是看人家写的拿来用,我看他 的结果都是 数字……
[/Quote]
恩是的 ,不过我这个字符串 的 组成形式是 5b{0}{1:X2}5d,占位符0是字符串内容,1是crc16的验校码,在最后一个字符前加0会和验校搞乱吗

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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