我正在寻找一种有效地将位插入位流并使其“溢出”并用 0 填充的方法。
因此,例如,如果您有一个包含 2 个字节的字节数组:231 和 109 (11100111 01101101),并且执行了 BitInsert(byteArray,4,00),它将在位偏移量 4 处插入两位,使得 11100001 11011011 01000000 (225,219, 24).即使该方法只允许 1 位插入也可以,例如BitInsert(byteArray,4,true) 或 BitInsert(byteArray,4,false),但该方法必须独立于比特流长度(流可能跨越数百个字节)。
我有一种方法可以做到这一点,但它必须一点一点地使用位掩码遍历流,所以我想知道是否有更简单的方法...
汇编或 C 派生的答案将不胜感激。
编辑:特定用例是一种编码方案的实现,该方案一次读取字节数组 6 位,并将它们(使用 2 位填充)编码为单个字节。所以每 6 位,你插入 2 位。 {33,66,99} 作为比特流是 001000010100001001100011 变成 00001000000101000000100100100011 注意插入为 xx: xx001000xx010100xx001001xx100011
我希望有一种方法可以在不走位的情况下做到这一点...... (此外,如果有人知道这种编码方案的正式名称,那将会很有帮助,因为我还没有确定它……它是在将旧的 C 程序移植到 C# 中时出现的)
最佳答案
我在监考中度过了一个小时,结果如下:
class BitStream
{
private List<byte> _bytes;
public BitStream()
{
_bytes = new List<byte>();
_bytes.Add(0);
}
public byte[] Data
{
get { return _bytes.ToArray(); }
}
public void Insert(int index, int value)
{
if (value < 0)
value *= -1;
int bit = value % 2;
byte bitmask = GetBitmask(index, bit);
// perform the right-shift operation
int active_byte = index / 8;
bool padded = PadIfNecessary();
int i;
if (padded)
i = _bytes.Count - 2;
else
i = _bytes.Count - 1;
for ( ; i > active_byte; --i)
{
_bytes[i] = (byte)(_bytes[i] << 1);
// carry from earlier byte if necessary
if ((_bytes[i - 1] & 128) == 128)
_bytes[i] |= 1;
}
// now shift within the target byte
_bytes[active_byte] = ShiftActiveByte(_bytes[active_byte], index);
_bytes[active_byte] |= GetBitmask(index, bit);
}
protected byte ShiftActiveByte(byte b, int index)
{
index = index % 8;
byte low_mask = 0;
byte high_mask = 255;
for (int i=0; i<index; ++i)
{
low_mask = (byte)((low_mask << 1) | 1);
high_mask = (byte)(high_mask << 1);
}
byte low_part = (byte)(b & low_mask);
byte high_part = (byte)(b & high_mask);
high_part <<= 1;
return (byte)(low_part | high_part);
}
protected byte GetBitmask(int index, int value)
{
return (byte)(value << (index % 8));
}
protected bool PadIfNecessary()
{
if ((_bytes[_bytes.Count - 1] & 128) == 128)
{
_bytes.Add(1);
return true;
}
else return false;
}
}
它不会处理超出内部数组现有边界的索引处的插入,但在我的非正式冒烟测试中会正确处理自身。
关于c# - 插入比特流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2633947/
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195
我想知道是否可以通过自动创建数组来插入数组,如果数组不存在的话,就像在PHP中一样:$toto[]='titi';如果尚未定义$toto,它将创建数组并将“titi”压入。如果已经存在,它只会推送。在Ruby中我必须这样做:toto||=[]toto.push('titi')可以一行完成吗?因为如果我有一个循环,它会测试“||=”,除了第一次:Person.all.eachdo|person|toto||=[]#with1billionofperson,thislineisuseless999999999times...toto.push(person.name)你有更好的解决方案吗?
在我的用户模型中,我有一堆属性,例如is_foos_admin和is_bars_admin,它们决定允许用户编辑哪些类型的记录。我想干掉我的编辑链接,目前看起来像这样:'edit'ifcurrent_user.is_foos_admin?%>...'edit'ifcurrent_user.is_bars_admin?%>我想做一个帮助程序,让我传入一个foo或bar并返回一个链接来编辑它,就像这样:助手可能看起来像这样(这不起作用):defedit_link_for(thing)ifcurrent_user.is_things_admin?link_to'Edit',edit_poly
我有以下现有的Dog对象数组,它们按age属性排序:classDogattr_accessor:agedefinitialize(age)@age=ageendenddogs=[Dog.new(1),Dog.new(4),Dog.new(10)]我现在想插入一条新的狗记录,并将它放在数组中的正确位置。假设我想插入这个对象:another_dog=Dog.new(8)我想把它插入到数组中,让它成为数组中的第三项。这是一个人为的示例,旨在演示我特别想如何将一个项目插入到现有的有序数组中。我意识到我可以创建一个全新的数组并重新对所有对象进行排序,但这不是我的目标。谢谢!
在字符串连接中,是否可以直接在语句中包含条件?在下面的示例中,我希望仅当dear列表不为空时才连接"mydear"。dear=""string="hello"+"mydear"unlessdear.empty?+",goodmorning!"但是结果报错:undefinedmethod'+'fortrue我知道另一种方法是在这条语句之前定义一个额外的变量,但我想避免这种情况。 最佳答案 使用插值而不是连接更容易和更具可读性:dear=""string="hello#{'mydear'unlessdear.empty?},goodmo
我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume
我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用